介绍
JavaScript中的对象是键 / 值对的集合。 值可以包含属性和方法 ,并且可以包含所有其他JavaScript数据类型,例如字符串,数字和布尔值。
JavaScript中的所有对象都来自父Object
构造函数。 Object
有许多有用的内置方法,我们可以使用它们和访问权限来简单地处理单个对象。 与在数组实例上使用的数组原型方法(如sort()
和reverse()
,Object方法直接在Object
构造函数上使用,并使用对象实例作为参数。 这称为静态方法。
本教程将介绍重要的内置对象方法,下面的每个部分都涉及特定方法并提供使用示例。
先决条件
为了充分利用本教程,您应该熟悉创建,修改和使用对象,您可以在“ 了解JavaScript中的对象 ”一文中查看这些对象 。
有关JavaScript的其他指导,您可以查看JavaScript系列中的“ 如何编码 ”。
的Object.create()
Object.create()
方法用于创建新对象并将其链接到现有对象的原型。
我们可以创建一个job
对象实例,并将其扩展为更具体的对象。
// Initialize an object with properties and methodsconst job = { position: 'cashier', type: 'hourly', isAvailable: true, showDetails() { const accepting = this.isAvailable ? 'is accepting applications' : "is not currently accepting applications"; console.log(`The ${this.position} position is ${this.type} and ${accepting}.`); }};// Use Object.create to pass propertiesconst barista = Object.create(job);barista.position = "barista";barista.showDetails();
The barista position is hourly and is accepting applications.
barista
对象现在有一个属性 – position
– 但是job
中的所有其他属性和方法都可以通过原型获得。 Object.create()
通过最小化重复来保持代码DRY非常有用。
Object.keys()
Object.keys()
创建一个包含对象键的数组。
我们可以创建一个对象并打印键数组。
// Initialize an objectconst employees = { boss: 'Michael', secretary: 'Pam', sales: 'Jim', accountant: 'Oscar'};// Get the keys of the objectconst keys = Object.keys(employees);console.log(keys);
["boss", "secretary", "sales", "accountant"]
Object.keys
可用于迭代对象的键和值。
// Iterate through the keysObject.keys(employees).forEach(key => { let value = employees[key]; console.log(`${key}: ${value}`);});
boss: Michaelsecretary: Pamsales: Jimaccountant: Oscar
Object.keys
对于检查对象的长度也很有用。
// Get the length of the keysconst length = Object.keys(employees).length;console.log(length);
4
使用length
属性,我们可以计算employees
的4
属性。
Object.values()
Object.values()
创建一个包含对象值的数组。
// Initialize an objectconst session = { id: 1, time: `26-July-2018`, device: 'mobile', browser: 'Chrome'};// Get all values of the objectconst values = Object.values(session);console.log(values);
[1, "26-July-2018", "mobile", "Chrome"]
Object.keys()
和Object.values()
允许您从对象返回数据。
Object.entries()
Object.entries()
创建对象的键/值对的嵌套数组。
// Initialize an objectconst operatingSystem = { name: 'Ubuntu', version: 18.04, license: 'Open Source'};// Get the object key/value pairsconst entries = Object.entries(operatingSystem);console.log(entries);
[ ["name", "Ubuntu"] ["version", 18.04] ["license", "Open Source"]]
一旦我们有了键/值对数组,我们就可以使用forEach()
方法循环并处理结果。
// Loop through the resultsentries.forEach(entry => { let key = entry[0]; let value = entry[1]; console.log(`${key}: ${value}`);});
name: Ubuntuversion: 18.04license: Open Source
Object.entries()
方法只返回对象实例自己的属性,而不返回可以通过其原型继承的任何属性。
Object.assign()
Object.assign()
用于将值从一个对象复制到另一个对象。
我们可以创建两个对象,并将它们与Object.assign()
合并。
// Initialize an objectconst name = { firstName: 'Philip', lastName: 'Fry'};// Initialize another objectconst details = { job: 'Delivery Boy', employer: 'Planet Express'};// Merge the objectsconst character = Object.assign(name, details);console.log(character);
{firstName: "Philip", lastName: "Fry", job: "Delivery Boy", employer: "Planet Express"}
也可以使用扩展运算符( ...
)来完成相同的任务。 在下面的代码中,我们将修改通过合并name
和details
对象来声明character
方式。
// Initialize an objectconst name = { firstName: 'Philip', lastName: 'Fry'};// Initialize another objectconst details = { job: 'Delivery Boy', employer: 'Planet Express'};// Merge the object with the spread operatorconst character = {...name, ...details}console.log(character);
{firstName: "Philip", lastName: "Fry", job: "Delivery Boy", employer: "Planet Express"}
对象文字中的这种扩展语法也称为浅层克隆。
Object.freeze()
Object.freeze()
可防止修改对象的属性和值,并防止在对象中添加或删除属性。
// Initialize an objectconst user = { username: 'AzureDiamond', password: 'hunter2'};// Freeze the objectconst newUser = Object.freeze(user);newUser.password = '*******';newUser.active = true;console.log(newUser);
{username: "AzureDiamond", password: "hunter2"}
在上面的示例中,我们尝试使用*******
覆盖密码hunter2
,但password
属性保持不变。 我们还尝试添加一个新的属性,但是没有添加。
Object.isFrozen()
可用于确定对象是否已冻结,并返回布尔值。
Object.seal()
Object.seal()
可防止将新属性添加到对象,但允许修改现有属性。 此方法类似于Object.freeze()
。 在实现下面的代码之前刷新控制台以避免错误。
// Initialize an objectconst user = { username: 'AzureDiamond', password: 'hunter2'};// Seal the objectconst newUser = Object.seal(user);newUser.password = '*******';newUser.active = true;console.log(newUser);
{username: "AzureDiamond", password: "*******"}
新的active
属性未添加到密封对象,但password
属性已成功更改。
Object.getPrototypeOf()
Object.getPrototypeOf()
用于获取对象的内部隐藏[[Prototype]]
,也可通过__proto__
属性访问。
在这个例子中,我们可以创建一个可以访问Array
原型的Array
。
const employees = ['Ron', 'April', 'Andy', 'Leslie'];Object.getPrototypeOf(employees);
[constructor: ƒ, concat: ƒ, find: ƒ, findIndex: ƒ, pop: ƒ, …]
我们可以在输出中看到employees
数组的原型可以访问pop
, find
和其他Array原型方法。 我们可以通过针对Array.prototype
测试employees
原型来确认这一点。
Object.getPrototypeOf(employees) === Array.prototype;
true
此方法可用于获取有关对象的更多信息或确保它可以访问另一个对象的原型。
还有一个相关的Object.setPrototypeOf()
方法,它将一个原型添加到另一个对象。 建议您使用Object.create()
因为它更快,性能更高。
结论
对象有许多有用的方法可以帮助我们修改,保护和迭代它们。 在本教程中,我们回顾了如何创建和分配新对象,迭代对象的键和/或值,以及冻结或密封对象。
如果您需要查看JavaScript对象,可以阅读“ 了解 JavaScript中的对象”。 如果您想熟悉原型链,可以查看“ 了解JavaScript中的原型和继承 ”。