继承!!

144 阅读1分钟

重写的逻辑

son继承了father。重写son中属性时,先确定属性的来源或在哪里找到的这个字段。
如果在son对象自己找到了这个字段则直接操作。
如果来自原型链上继承来的,则先浅拷贝到son上再对本身拷贝后的值操作。
但是由于浅拷贝的原因,引用类型的拷贝没有意义还浪费栈内存空间所以js实际运行结果是如果是引用类型则在哪找到的在哪改。(属于是摆烂了)

原型链继承

直接让子类原型指向父类实例。

let b = new B();
b.__proto__ = new A();

问题:引用类型共用

构造函数继承

在子类构造函数中使用父类构造函数强化。

//解决了引用共用问题
function B(){
  A.call(this);
}

问题
每个子类都继承于一个独立的父类实例,大量内存浪费
所有属性方法写在构造函数中无法复用
不能跨节点继承

组合继承

构造函数继承A实例并重写构造方法改回自己。 构造函数偷用A进行实例加强。

function B (){
  A.call(this);
}
B.prototype = new A();
B.constructor = B;

问题
原型有父类实例,自己又使用父类构造函数强化,父类属性与方法覆盖重合。 但是可以跨节点继承了,可以操作原型添加方法了,可以私有引用类型了。

组合寄生式继承

使用组合继承但是原型指向操作跨过父类构造直接指向父类的原型。

function B(){
  A.call(this);
}
function myExtend (son,father){
    let proto = Object.create(father.prototype);
    proto.constructor = son;
    son.prototype = proto;
}
myExtend(B,A);

最成熟的方法。