Object.getPrototypeOf(B) === A // true
ES5中得到某个对象的原型对象的标准方法是Object.getPrototypeOf()
所以父类A是子类B的原型
所以对两条继承线我的理解是:
(1)是继承父类的本身的属性和方法(静态属性和静态方法)
(2)是继承父类的实例方法和实例属性
ES5给出的解释
JavaScript的对象是可以从类的原型对象中继承属性(通常是继承方法).如果b是类B的实例,B是A的子类,那么b也一定从A继承了属性.为此,首先要确保B的原型对象继承自A的原型对象B.prototype = inherit(A.prototype), B.prototype.constructor = B, 这两行代码是在JavaScript中创建子类的关键,如果不这样做,原型对象仅仅是一个普通对象,它只继承自Object.prototype, 这意味着你的类和所有的类一样是Object的子类
子类实例的proto属性的proto属性,指向父类实例的proto属性。也就是说,子类的原型的原型,是父类的原型。
const b = new B()
b.__proto__ === B.prototype // true
const a = new A()
b.__proto__.__proto__ === a.__proto__ // true
因此,通过子类实例的 __ proto__.__ proto__ 属性,可以修改父类实例的行为
这里谈一下extend在ES5中的实现
// 把p中可枚举的属性复制到o中, 并返回o, 缺少对IE的支持
function (o, p) {
for(prop in p) {
o[prop] = p[prop]
}
return o;
}