Get to know MDN better
此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
对象初始化器是一个用大括号({})括起来的以逗号分隔的列表,包含了一个对象的零个或多个属性名称和相关值。可以通过 Object.create() 方法,或者使用 new 运算符调用其构造函数而初始化一个对象。
对象初始化器是一个描述 Object 初始化的表达式。对象由用于描述对象的属性组成。对象属性的值可以包含基本数据类型或其他对象。
对象字面的语法与 JavaScript Object Notation(JSON)不一样。虽然它们看起来很相似,但它们之间还是有区别的:
JSON 是对象字面语法的一个真子集,意味着每一个有效的 JSON 文本都可以被解析为对象字面,并且不会引起语法错误。唯一的例外是,对象字面语法禁止重复的 __proto__ 键,这不适用于 JSON.parse()。后者将 __proto__ 像普通的属性一样对待,并将最后一次出现的对象作为该属性的值。它们所代表的对象值(也就是它们的语义)唯一不同的时候,也就是当源码包含 __proto__ 键的时候——对于对象字面,它设置对象的原型;对于 JSON,它是一个普通的属性。
没有属性的空对象可以用以下方式创建:
字面初始化器符号的优势在于能够快速创建带有大括号内属性的对象,可以快速记录下一个以逗号分隔的 key: value 对的列表。
如下代码创建了一个含三个属性的对象,键分别为 "foo"、"age" 和 "baz"。这些键对应的值,分别是字符串 "bar",数字 42 和另一个对象。
创建对象后,可以读取或者修改它。对象属性可以用下标小圆点标记或者方括号标记访问。参见属性访问器获取更多信息。
上面学习了如何用初始化语法对象属性。经常能遇到希望将代码中的变量放到对象中的情况。可能遇到如下代码:
有更简短的标记可以实现同样的效果:
属性使用了同样的名称时,后面的属性会覆盖前面的属性。
在 ES2015 之后,任何地方都允许重复属性名出现,也包括严格模式。你也可以在类中使用重复的属性名。唯一的例外是私有元素,在整个类中它必须是唯一的。
对象属性也可以是一个函数、getter 或 setter 方法。
存在一种更简短的写法,关键字 function 也可以省略。
也可以简短地定义生成器方法。
这相当于这个类似 ES5 的符号(但注意 ECMAScript 5 没有生成器):
有关方法的更多信息和例子,请参见方法定义。
对象初始化器的语法也支持计算的属性名称。这允许你把一个表达式放在中括号 [] 中,它将被计算并作为属性名使用。这让人想起属性访问器语法中的括号符号,你可能已经用它来读取和设置属性。
现在你也可以在对象字面量上使用类似的语法:
对象字面量支持扩展语法。它将自己提供的对象的枚举属性复制到一个新的对象上。
现在可以使用比 Object.assign() 更短的语法来实现浅拷贝(不包括 prototype)或合并对象。
警告:请注意,Object.assign() 会触发 setter,而展开语法不会!
一个形式为 __proto__: value 或 "__proto__": value 的属性定义并没有创建一个名称为 __proto__ 的属性。相反,如果提供的值是一个对象或 null 值,它将创建对象的 [[Prototype]] 指向该值(如果该值不是一个对象或 null,该对象不会被改变)。
请注意,__proto__ 键是标准化的语法,与非标准且性能不佳的 Object.prototype.__proto__ 访问器不同。它在创建对象时设置了 [[Prototype]],类似于 Object.create——而不是变更原型链。
在对象字面值中,仅允许有一个原型 setter;多个原型 setter 会被视为语法错误。
不使用“冒号”标记法的属性定义不是原型 setter。它们是属性定义,其行为与使用任何其他名称的类似定义相同。
| ECMAScript® 2027 Language Specification # sec-object-initializer |
启用 JavaScript 以查看此浏览器兼容性表。