返回信息流标题:JS中寄生组合式继承中为什么要使用原型式继承的方法继承父类的原型呢?
在《js高程》上看到了寄生组合式继承这一节,但是对书上给出的代码不太明白。
我理解的是:寄生组合式继承是为了避免组合继承中实例属性和原型对象中属性重复的问题,它使用借用构造函数的方法继承父类构造函数中的属性,使用原型式继承的方法继承父类的原型对象。
这是书上的代码:
function inheritPrototype(SubType,SuperType){
var pro = Object.create(SuperType.prototype);
pro .constructor = SubType;
SubType.prototype = pro ;
}
但是,它和下面的函数有什么区别呢?
function inheritPrototype(SubType,SuperType){
SubType.prototype = SuperType.prototype;
SubType.prototype.constructor = SubType;
}
不太明白为什么要使用原型式继承的方法继承父类的原型,原型式继承不就是一个浅复制吗?这和直接赋值有什么区别呢?
[ema1][ema1]
这是一条镜像帖。来源:北邮人论坛 / java-script / #3959同步于 2018/6/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
JavaScript机器人发帖
JS中寄生组合式继承的疑问
ColaeR
2018/6/26镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
Object.create()内部相当于创建了一个空构造函数实现连接。我是这么理解的Object.create(p)相当于下面的操作:
var sub;
function F(){}
F.prototype = p
sub = new F()
retuen sub
因为你对JS的继承完全没理解,JS的继承是把子构造函数的原型设置成父构造函数的一个实例,这样子构造函数添加原型属性时,其实是在往那个父构造函数实例中添加属性,并不会影响父构造函数
你后面这个做法是把子构造函数的原型直接设置成父构造函数的原型了,那岂不是在子构造函数的原型中添加属性时,相当于直接操作父构造函数的原型了,这样是给父构造函数制造了个兄弟,兄弟俩共享一个原型,不是孩子
而且你还加了这么一句SubType.prototype.constructor = SubType;相当于破坏了父构造函数的结构
[ema1]谢谢解答,我现在明白了[ema1][ema1]
【 在 dahai (大海) 的大作中提到: 】
: 因为你对JS的继承完全没理解,JS的继承是把子构造函数的原型设置成父构造函数的一个实例,这样子构造函数添加原型属性时,其实是在往那个父构造函数实例中添加属性,并不会影响父构造函数
: 你后面这个做法是把子构造函数的原型直接设置成父构造函数的原型了,那岂不是在子构造函数的原型中添加属性时,相当于直接操作父构造函数的原型了,这样是给父构造函数制造了个兄弟,兄弟俩共享一个原型,不是孩子
: 而且你还加了这么一句SubType.prototype.constructor = SubType;相当于破坏了父构造函数的结构