扩展对象的功能性

2020-08-09  本文已影响0人  McDu
  1. 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
  1. 重复属性,es5严格模式报错,es6取最后一个属性。
  2. 自由属性枚举顺序
  1. 所有数字键按升序排序。
  2. 所有字符串键按它们被加入对象的顺序排序。
  3. 所有 symbol 键按它们被加入对象的顺序排序。

可用 Object.keys()Object.getOwnPropertyNames()Reflect.ownKeys() 验证。

对于for-in 循环,由于并非所有厂商都遵循相同的实现方式,因此仍未指定一个明确的枚举顺序;而Object.keys()JSON.stringify() 都指明与 for-in 使用相同的枚举顺序,因此它们的枚举顺序目前也不明晰。

增强对象原型

  1. 改变对象的原型:Object.setPrototypeOf()
    对象原型的真实值被储存在内部专业属性[[Prototype]]中,调用Object.getPrototypeOf() 返回储存在其中的值,调用Object.setPrototypeOf() 改变其中的值。这不是操作[[Prototype]]值的唯一方法。

  2. 简化原型访问的super引用
    super.getGreeting() 相当于在当前上下文中调用Object.getPrototypeOf(this).getGreeting.call(this)(多重继承有问题,super不会), 同样,可通过 super 引用调用对象原型上所有其他的放个。必须要在使用简写方法的对象中使用super引用。

  3. es6 正式将方法定义为一个函数,该方法会有一个内部的[[HomeObject]] 属性来容纳这个方法从属的对象。
    非对象的方法则没有这个属性。
    使用super引用时非常有用,super的所有引用都是通过[[HomeObject]] 来确定后续的运行过程。

    1. [[HomeObject]]属性上调用Object.getPrototypeOf()方法来检索原型的引用;
    2. 搜寻原型找到同名函数;
    3. 设置this绑定并调用相应的方法。

super.getGreeting() 等同于 father.getGreeting.call(this).

上一篇下一篇

猜你喜欢

热点阅读