继承的内部原理

112 阅读1分钟
class A {
}

class B {
}

Object.setPrototypeOf(B.prototype, A.prototype);// B的实例继承A的实例

Object.setPrototypeOf(B, A);// B继承A的静态属性

or 

class B extends A {
}
Object.setPrototypeOf的简单实现如下:
Object.setPrototypeOf = function (obj, proto) {
  obj.__proto__ = proto;
  return obj;
}

所以继承相当于
B.prototype.__proto__ = A.prototype;
B.__proto__ = A;

Class作为构造函数的语法糖,同时有prototype属性和__proto__属性,因此同时存在两条继承链。
这两条继承链,可以这样理解:作为一个对象,子类(B)的原型(__proto__属性)是父类(A);作为一个构造函数,子类(B)的原型(prototype属性)是父类的实例。