重写的逻辑
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);
最成熟的方法。