js高级程序设计学习笔记之一
第六章 OO programming的继承中的Parasitic Combination Inheritance,用了inheritPrototype方法实现继承,方法如下:
function inheritPrototype(subType, superType){ var prototype = object(superType.prototype); //create object prototype.constructor = subType; //augment object subType.prototype = prototype; //assign object }
调用inheritPrototype实现子类和父类的继承后,用instanceof查看子类和父类的关系,结果返回的都是true。看似实现了子类和父类的继承。
但是令我百思不得其解的是,为什么用父类的原型对象可以实现父类和子类的继承。
最开始,我是这样思考的:
在多层继承中,将父类的原型的实例对象赋值给子类的原型,理论上父类和子类的原型是同一个对象。
比如B继承A,这样B的原型是A的对象,如果在C继承B时,把B的原型对象赋值给C,岂不是C的原型也是A?
PS:并且这段代码跑不通,可能是伪代码吧。。。把object改成Object后能调试。。。。
用了ABC三个对象去调用这个继承关系,理论上应该是B继承A,C继承B。
结果跟踪代码查看,发现,在这个方法调用后,ABC的原型都是C。所以instanceof返回的全是true,所有被这个方法接触过的对象的原型全是最后一个对象!
如果要实现B继承A,C继承B,应该是A和B,B和C之间两两发生继承关系,因为每个对象的prototype都已经是父类的对象了,只有constructor是指向自己的。
所以可以将创建对象的语句改成这样:
var prototype = new superType.prototype.constructor(); //create object
调试了一下,A,B,C之间实现了继承,每个的prototype是父类的实例,constructor是自己。

浙公网安备 33010602011771号