对象初始值设定项

对象初始化器是一个以逗号分隔的列表,由零对或多对属性名和对象的关联值组成,用大括号括起来({}). 也可以使用初始化对象对象.create()通过调用构造函数使用新的操作员。

试试看

语法

js公司
o={a: “foo”,b: 42、,c: {},1:“数字文字属性”,“foo:bar”:“字符串文字属性”,速记属性,方法(参数){// …},获取属性(){},设置属性(值){},[表达式]:“计算属性”,__proto__:原型,…spreadProperty,};

描述

对象初始值设定项是描述对象.对象包括属性,用于描述对象。对象属性的值可以包含原始的数据类型或其他对象。

对象文字语法与JSON

对象文字语法与J型阿瓦S公司脚本O(运行)对象N个旋转(JSON格式). 虽然它们看起来很相似,但它们之间存在差异:

  • JSON格式只有允许使用“属性”:value语法。属性名称必须用双引号引起来,并且定义不能是速记。也不允许使用计算属性名称。
  • JSON对象属性值只能是字符串、数字、,真的,,无效的、数组或其他JSON对象。这意味着JSON不能表达方法或非显式对象,如日期注册Exp.
  • 在JSON中,“__协议__”是一个普通属性键。在对象文字中,它设置对象的原型.

JSON是一个严格子集对象文字语法,这意味着每个有效的JSON文本都可以解析为对象文字,并且可能不会导致语法错误。唯一的例外是对象文字语法禁止重复__原型__键,不适用于JSON.parse().后者治疗__原型__类似于普通属性,并将最后一个匹配项作为属性的值。它们表示的对象值(也就是它们的语义)唯一不同的时候,也是源包含__原型__键-对于对象文字,它设置对象的原型;对于JSON,它是一个普通属性。

js公司
console.log(JSON.parse('{“__proto__”:0,“__prodo__”:1}');//{__proto_:1}控制台.log({“__proto__”:0,“__prodo__”:1});//语法错误:对象文本中不允许有重复的__proto__字段console.log(JSON.parse('{“__proto__”:{}}');//{__proto_:{}}控制台.log({“__proto__”:{}});//{}(以{}为原型)

示例

创建对象

可以这样创建没有属性的空对象:

js公司
常量对象={};

然而字面意义的初始值设定项表示法是,您可以快速创建属性位于花括号内的对象。你记下了键:值由逗号分隔的对。

下面的代码创建了一个具有三个属性的对象,键是“foo”,“年龄”“呸”。这些键的值是一个字符串“酒吧”,数字42和另一个对象。

js公司
常量对象={foo:“bar”,年龄:42岁,baz:{myProp:12},};

访问属性

创建对象后,可能需要读取或更改它们。可以使用点表示法或括号表示法访问对象属性。(请参见属性访问器以获取详细信息。)

js公司
对象.foo;//“酒吧”对象[“年龄”];//42object.baz;//{我的属性:12}对象.baz.myProp//12

特性定义

我们已经学习了如何使用初始化器语法标记属性。通常,您希望将代码中的变量放入对象中。您将看到如下代码:

js公司
const a=“foo”;常数b=42;常数c={};常数o={a: a、,b: b、,c: c、,};

有一个较短的符号可用于实现相同的目的:

js公司
const a=“foo”;常数b=42;常数c={};//速记特性名称const o={a,b,c};//换句话说,控制台.log(o.a==={a}.a);//真的

重复的属性名称

对属性使用相同名称时,第二个属性将覆盖第一个属性。

js公司
常数a={x:1,x:2};控制台.log(a);//{x:2}

ES2015之后,到处都允许重复的属性名称,包括严格模式。也可以在中使用重复的属性名。唯一的例外是私人财产,它在类主体中必须是唯一的。

方法定义

对象的属性也可以引用功能或a吸气剂设置器方法。

js公司
常数o={属性:函数(参数){},获取属性(){},设置属性(值){},};

可以使用速记符号,以便关键字功能不再需要。

js公司
//速记方法名称常数o={属性(参数){},};

还有一种方法可以简洁地定义生成器方法。

js公司
常数o={*发电机(){// …},};

这相当于类似ES5的符号(但请注意ECMAScript 5没有生成器):

js公司
常数o={生成器:函数*(){// …},};

有关方法的更多信息和示例,请参见方法定义.

计算的属性名称

对象初始值设定项语法还支持计算属性名。它允许您将表达式放在方括号中[],它将被计算并用作属性名。这让人想起属性访问器语法,您可能已经使用它来读取和设置属性。

现在,您也可以在对象文字中使用类似的语法:

js公司
//计算的属性名称设i=0;常数a={[`foo${++i}`]:i,[`foo${++i}`]:i,[`foo${++i}`]:i,};控制台.log(a.foo1);//1控制台.log(a.foo2);//2控制台.log(a.foo3);//常量项=[“A”、“B”、“C”];常量对象={[项目]:“你好”,};控制台.log(obj);//A、 B、C:“你好”控制台.log(obj[“A,B,C”]);//“你好”const param=“大小”;常量配置={[参数]:12,[`mobile${param.charAt(0).toUpperCase()}${param切片(1)}`]:4,};console.log(配置);//{大小:12,手机大小:4}

排列属性

对象文字支持扩展语法。它将自己的可枚举属性从提供的对象复制到新对象上。

浅克隆(不包括原型)或合并对象现在可以使用比Object.assign().

js公司
常量obj1={foo:“bar”,x:42};常量obj2={foo:“baz”,y:13};常量克隆对象={…obj1};//{foo:“bar”,x:42}const mergedObj={…obj1,…obj2};//{foo:“baz”,x:42,y:13}

警告:请注意Object.assign()触发器设置器,而扩展语法却没有!

原型设置器

表单的属性定义__原型_:值“__proto__”:值不创建名称为的属性__原型__。相反,如果提供的值是对象或无效的,它指向[[原型]]将所创建对象的值设置为该值。(如果值不是对象或无效的,对象未更改。)

请注意__原型__关键是标准化的语法,而不是非标准的和未执行的语法对象原型__原型__访问器。它设置了[[原型]]在对象创建过程中,类似于对象.创建-而不是改变原型链。

js公司
常量obj1={};console.log(Object.getPrototypeOf(obj1)===对象原型);//真的常量obj2={__proto_:空};console.log(Object.getPrototypeOf(obj2));//无效的const protoObj={};常量对象3={“__proto__”:protoObj};console.log(Object.getPrototypeOf(obj3)===protoObj);//真的const obj4={__proto__:“不是对象或空”};console.log(Object.getPrototypeOf(obj4)===对象原型);//真的console.log(Object.hasOwn(obj4,“__proto__”));//

对象文本中只允许使用单个原型setter。多个原型setter是一个语法错误。

不使用“冒号”表示法的属性定义不是原型设置器。它们是特性定义,其行为与使用任何其他名称的类似定义相同。

js公司
const __proto__=“变量”;常量obj1={__proto__};console.log(Object.getPrototypeOf(obj1)===对象原型);//真的console.log(Object.hasOwn(obj1,“__proto__”));//真的控制台.log(obj1.__proto__);//“变量”const obj2={__proto_(){返回“hello”;}};控制台.log(obj2.__proto_());//“你好”const obj3={[“__proto__”]:17};控制台.log(obj3.__proto__);//17//使用“__proto__”键将prototype setter与普通自己的属性混合常量obj4={[“__proto__”]:17,__proto:{}};//{__proto_:17}(以{}作为原型)常量对象5={[“__proto__”]:17,__原型_:{},__proto__:null,//语法错误:对象文本中不允许重复的__proto__字段};常量对象6={[“__proto__”]:17,[“__proto__”]:“你好”,__proto__:空,}; // {__proto__:“hello”}(原型为null)常量对象7={[“__proto__”]:17,__原型__,__proto__:空,}; // {__proto__:“变量”}(原型为null)

规格

规范
ECMAScript语言规范
#秒对象初始化器

浏览器兼容性

BCD表仅在浏览器中加载

另请参见