最近在编写一个js库采用的是面向对象的思想来进行编写,因此在js继承上有了一定的问题
js继承有几种继承方式,分别为原型继承,类似继承,混合继承。
原型继承:
var child = function(){}
var parent = function(){}
child.prototype=new parent();//核心
原型继承存在一个问题,就是构造函数容易被重置,在继承前,child 的构造函数指向自己,然而继承之后就容易转向object,所以在继承之后需要更正构造函数的指向
child.prototype.constructor = chid;
原型继承存在一个问题,如果父级中存在引用类型的话,那么子类是有影响的,所以这成了一个问题。
类似继承
var parent=function(){}
var child=function(){
parent.apply(this,arguments);
}
类似继承解决了原型继承的引用类型对子类的影响问题,但是在判断子类child是否属于父类parent的时候就无法判断(instanceof),在某些场景中可能需要判断是否属于父类的子类情况,因此此继承方式就无法解决。
为了解决上述的两个问题,因此产生了混合继承的方式,混合继承方式,主要结合了原型继承以及类似继承。
混合继承:
var parent = function(){ }
var child = function(){
parent.apply(this,arguments);
}
child.prototype=new parent();//核心
child.prototype.constructor = chid;
这样就完成了混合继承方式,但是仔细看就能发现问题,在原型继承的时候new 了一次父类,而在构造函数内又一次调用了父类,因此在混合继承就产生了一个新的问题就是混合继承在使用的时候会调用两次父类。
每种继承都拥有本身的缺点不可能完成一个好的继承方式,因此在使用继承的时候应该注重场合使用不同的继承方式,以提高效率
原文:http://www.cnblogs.com/Sekeys/p/3852915.html