扩展对象的功能性
2020-08-09 本文已影响0人
McDu
-
Object.assign()
不能将提供者的访问器属性复制到接收对象中。由于Object.assign()
方法执行了赋值操作,因此提供者的访问器属性最终会变为接收对象中的一个数据属性。
var receiver = {},
supplier = {
get name() {
return 'abc';
}
}
Object.assign(receiver, supplier);
var desc = Object.getOwnPropertyDescriptor(receiver, 'name');
console.log(desc.value); // 'abc'
console.log(desc.get); // undefined
- 重复属性,es5严格模式报错,es6取最后一个属性。
- 自由属性枚举顺序
- 所有数字键按升序排序。
- 所有字符串键按它们被加入对象的顺序排序。
- 所有 symbol 键按它们被加入对象的顺序排序。
可用 Object.keys()
、 Object.getOwnPropertyNames()
、Reflect.ownKeys()
验证。
对于
for-in
循环,由于并非所有厂商都遵循相同的实现方式,因此仍未指定一个明确的枚举顺序;而Object.keys()
和JSON.stringify()
都指明与for-in
使用相同的枚举顺序,因此它们的枚举顺序目前也不明晰。
增强对象原型
-
改变对象的原型:
Object.setPrototypeOf()
对象原型的真实值被储存在内部专业属性[[Prototype]]
中,调用Object.getPrototypeOf()
返回储存在其中的值,调用Object.setPrototypeOf()
改变其中的值。这不是操作[[Prototype]]
值的唯一方法。 -
简化原型访问的super引用
super.getGreeting()
相当于在当前上下文中调用Object.getPrototypeOf(this).getGreeting.call(this)
(多重继承有问题,super不会), 同样,可通过 super 引用调用对象原型上所有其他的放个。必须要在使用简写方法的对象中使用super引用。 -
es6 正式将方法定义为一个函数,该方法会有一个内部的
[[HomeObject]]
属性来容纳这个方法从属的对象。
非对象的方法则没有这个属性。
使用super引用时非常有用,super的所有引用都是通过[[HomeObject]]
来确定后续的运行过程。- 在
[[HomeObject]]
属性上调用Object.getPrototypeOf()
方法来检索原型的引用; - 搜寻原型找到同名函数;
- 设置
this
绑定并调用相应的方法。
- 在
super.getGreeting()
等同于 father.getGreeting.call(this)
.