对象类型
- 普通对象:拥有 js 对象所有默认的内部行为。
- 奇异对象:某些方面,内部行为不同于默认行为。
- 标准对象:标准中定义的对象,可以是普通的,也可以是奇异的。
- 内置对象:js 运行环境提供的对象。
对象字面量扩展
当对象字面量只有属性名称时,js 引擎会在周边作用域中查找与该名称相同的变量,将变量的值赋给对应的属性。如:
(a, b) => {
return {
a,
b
};
}
对象的方法可以直接在属性名后面添加 '()' ,这种书写形式(称为方法简写)可以使用 super ,最原始的形式则不能。如:
// 方法名也就是对象的属性名
let obj = {
// 原始写法
methodName : function() {
// body
}
methodName() {
// body
}
}
如果对象的属性名具有特殊字符,可以使用方括号对其进行引用,不能使用点操作符引用。方括号里面的内容通过计算得出。如:
let tail = " b";
let obj = {
["a" + tail] : "xyz",
["z" + tail] : "abc"
};
obj["a b"]; // xyz
obj["z b"]; // abc
新方法
Object.is()
方法接收两个参数,只有当两个参数的类型和值同时相同时才返回 true。
Object.is(+0, -0); // false
Object.is(NaN, NaN); // true
Object.is(5, "5"); // false
Object.assign()
方法接收一个 receiver 对象和任意多个 supplier 对象,按照传入的 supplier 对象,将 supplier 对象的属性浅复制给 receiver 对象。若不同的 supplier 对象具有相同的属性而属性值不同时,则该属性最后一个复制的属性值作为 receiver 对象该属性的值,因为前面复制的值被覆盖了。supplier 对象的 get 属性复制之后会成为 receiver 对象的数据属性。
重复的对象字面量属性
对象中如果属性重复,则最后定义的属性值生效。
自有属性枚举顺序
对象的属性枚举时,顺序为:
- 按升序排列的数字类型键
- 按添加(定义)顺序的字符串类型键
- 按添加顺序的符号类型键
for-in 循环、Object.keys()
方法和 JSON.stringify()
方法使用同样的枚举顺序,但没有明确规定顺序。
更强大的原型
对象的原型会在调用构造器或者 Object.create()
方法时确定。
Object.setPrototypeOf()
方法接收两个参数:第一个参数为需要修改原型的对象,第二个参数为取代之前原型的对象。这个方法用于更改对象原型。
原型的值由内部属性 [[Prototype]] 存储,Object.getPrototypeOf()
方法返回该属性存储的值,Object.setPrototypeOf()
方法修改这个值。
在方法简写情况下,方法内部使用的 super 是对当前对象原型的引用。
正式的“方法”定义
以前的 “方法” 表示对象的函数属性,没有正式定义。现在,方法是指有 [[HomeObject]] 内部属性的函数,这个内部属性指向该方法所属的对象。
使用 super 时,会在 [[HomeObject]] 属性上调用 Object.getPrototypeOf()
方法来获得当前对象原型的引用。
参考
[1] Zakas, Understanding ECMAScript 6, 2017.