安对象初始化器是一个以逗号分隔的列表,由零对或多对属性名和对象的关联值组成,用大括号括起来({}
). 也可以使用初始化对象对象.create()
或通过调用构造函数使用新的
操作员。
o={a: “foo”,b: 42、,c: {},1:“数字文字属性”,“foo:bar”:“字符串文字属性”,速记属性,方法(参数){// …},获取属性(){},设置属性(值){},[表达式]:“计算属性”,__proto__:原型,…spreadProperty,};
对象初始值设定项是描述对象
.对象包括属性,用于描述对象。对象属性的值可以包含原始的数据类型或其他对象。
对象文字语法与J型阿瓦S公司脚本O(运行)对象N个旋转(JSON格式). 虽然它们看起来很相似,但它们之间存在差异:
- JSON格式只有允许使用
“属性”:value
语法。属性名称必须用双引号引起来,并且定义不能是速记。也不允许使用计算属性名称。
- JSON对象属性值只能是字符串、数字、,
真的
,假
,无效的
、数组或其他JSON对象。这意味着JSON不能表达方法或非显式对象,如日期
或注册Exp
.
- 在JSON中,
“__协议__”
是一个普通属性键。在对象文字中,它设置对象的原型.
JSON是一个严格子集对象文字语法,这意味着每个有效的JSON文本都可以解析为对象文字,并且可能不会导致语法错误。唯一的例外是对象文字语法禁止重复__原型__
键,不适用于JSON.parse()
.后者治疗__原型__
类似于普通属性,并将最后一个匹配项作为属性的值。它们表示的对象值(也就是它们的语义)唯一不同的时候,也是源包含__原型__
键-对于对象文字,它设置对象的原型;对于JSON,它是一个普通属性。
console.log(JSON.parse('{“__proto__”:0,“__prodo__”:1}');//{__proto_:1}控制台.log({“__proto__”:0,“__prodo__”:1});//语法错误:对象文本中不允许有重复的__proto__字段console.log(JSON.parse('{“__proto__”:{}}');//{__proto_:{}}控制台.log({“__proto__”:{}});//{}(以{}为原型)
可以这样创建没有属性的空对象:
然而字面意义的或初始值设定项表示法是,您可以快速创建属性位于花括号内的对象。你记下了键:值
由逗号分隔的对。
下面的代码创建了一个具有三个属性的对象,键是“foo”
,“年龄”
和“呸”
。这些键的值是一个字符串“酒吧”
,数字42
和另一个对象。
常量对象={foo:“bar”,年龄:42岁,baz:{myProp:12},};
创建对象后,可能需要读取或更改它们。可以使用点表示法或括号表示法访问对象属性。(请参见属性访问器以获取详细信息。)
对象.foo;//“酒吧”对象[“年龄”];//42object.baz;//{我的属性:12}对象.baz.myProp//12
我们已经学习了如何使用初始化器语法标记属性。通常,您希望将代码中的变量放入对象中。您将看到如下代码:
const a=“foo”;常数b=42;常数c={};常数o={a: a、,b: b、,c: c、,};
有一个较短的符号可用于实现相同的目的:
const a=“foo”;常数b=42;常数c={};//速记特性名称const o={a,b,c};//换句话说,控制台.log(o.a==={a}.a);//真的
重复的属性名称
对属性使用相同名称时,第二个属性将覆盖第一个属性。
常数a={x:1,x:2};控制台.log(a);//{x:2}
ES2015之后,到处都允许重复的属性名称,包括严格模式。也可以在中使用重复的属性名类。唯一的例外是私人财产,它在类主体中必须是唯一的。
对象的属性也可以引用功能或a吸气剂或设置器方法。
常数o={属性:函数(参数){},获取属性(){},设置属性(值){},};
可以使用速记符号,以便关键字功能
不再需要。
还有一种方法可以简洁地定义生成器方法。
这相当于类似ES5的符号(但请注意ECMAScript 5没有生成器):
有关方法的更多信息和示例,请参见方法定义.
对象初始值设定项语法还支持计算属性名。它允许您将表达式放在方括号中[]
,它将被计算并用作属性名。这让人想起属性访问器语法,您可能已经使用它来读取和设置属性。
现在,您也可以在对象文字中使用类似的语法:
//计算的属性名称设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()
.
常量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}
表单的属性定义__原型_:值
或“__proto__”:值
不创建名称为的属性__原型__
。相反,如果提供的值是对象或无效的
,它指向[[原型]]
将所创建对象的值设置为该值。(如果值不是对象或无效的
,对象未更改。)
请注意__原型__
关键是标准化的语法,而不是非标准的和未执行的语法对象原型__原型__
访问器。它设置了[[原型]]
在对象创建过程中,类似于对象.创建
-而不是改变原型链。
常量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是一个语法错误。
不使用“冒号”表示法的属性定义不是原型设置器。它们是特性定义,其行为与使用任何其他名称的类似定义相同。
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)
BCD表仅在浏览器中加载