es6-class

  • 类的内部所有定义的方法,都是不可枚举的
  • 父类的静态方法,可以被子类继承。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Object.setPrototypeOf = function (obj, proto) {
    obj.__proto__ = proto;
    return obj;
    }
    Object.setPrototypeOf(B.prototype, A.prototype);
    // 等同于
    B.prototype.__proto__ = A.prototype;

    Object.setPrototypeOf(B, A);
    // 等同于
    B.__proto__ = A;

    Object.create(A.prototype);
    // 等同于
    B.prototype.__proto__ = A.prototype;

super

  • this关键字总是指向函数所在的当前对象
  • ES6 又新增了另一个类似的关键字super,指向当前对象的原型对象。
    JavaScript 引擎内部,super.foo等同于Object.getPrototypeOf(this).foo(属性)或Object.getPrototypeOf(this).foo.call(this)(方法)。

obj各种操作

方法 遍历对象 枚举 Symbol属性
forin 对象自身+继承 可枚举 no
keys 对象自身 可枚举 no
stringify 对象自身 可枚举
asign 对象自身 可枚举
getOwnPropertyNames 对象自身 所有 no
getOwnPropertySymbols 对象自身 - 仅包含Symbol键名
Reflect.ownKeys 对象自身 所有 所有
  • 操作中引入继承的属性会让问题复杂化,所以,尽量不要用for…in循环,而用Object.keys()代替。

Object.getPrototypeOf()(读操作)
Object.setPrototypeOf()(写操作)
Object.create()(生成操作)代替。

  • 实现上,__proto__调用的是Object.prototype.__proto__