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是自己。

 

 

posted @ 2013-09-11 15:03  sunnyfish  阅读(203)  评论(0)    收藏  举报