实际真正算起来js中继承的方法也就三种,下面一一说明
第一种:原型链继承
先说原型继承的语句,newFunction.prototype=new oldFunction()
很简单就是将基函数的一个实例赋给新函数的原型,这种继承方法可以说是直接,简单,有效,基函数中的所有属性方法都可以被继承,推荐使用.
不过这种方法也有不足,比如说当基函数中的属性有一个是动态属性的时候,oldFunction.arr=[“lirongfei”,”yangdanping”];当继承这个基函数后,所有的新函数都会包含一样的arr属性,特别是当你arr.push()新值的时候,所有的新函数的arr属性都是一样的.因为你改变的是所有新函数所共有的原型对象
总结一点:原型链继承方法,使用,但由于原型实例共享的特点,所以当基函数中包含有动态属性(比如数组)时,而且你要根据不同实时改变时,就不能用这种方法继承了
第二种:构造函数继承
先说构造函数继承的语句:
function newFunction(){
oldFunction.call(this,[“canshu1”,”canshu2”,…]);
}
第二种方法对那些只包含属性的基函数,很实用,首选,但是如果基函数中包含方法属性,就不推荐使用,原因就是构造函数内部函数会重复调用的问题,谈不上对象复用
第三种:实例继承
这种方式要区别原型链继承,先说继承方法
第一步:公用继承函数:
function object(o){
function f(){};
f.prototype=o;
return new f();
}
第二步:当你已经有一个实例时,注意是实例,而不是对象,就可以var newFunction=new object(nowInstance);这样就复制出当前实例的一个副本,然后你就可以想这个副本中添加新的属性和方法,而且不会影响当前实例
这种方法的使用情景就是,当你现在有一个实例时,用这种方法先(通过原型赋值)复制出这样一个实例,然后向这个副本中添加新的属性和方法
缺点就是实际内部也是通过原型链实现的,当然缺点也是属性共享,而不能独享,优势就是你可以直接那实例来继承,而不用new一个新实例,同时也浪费了当前实例.
和原型链继承的区别就是,这个事继承实例,而原型链是继承对象
第三种:通用最佳继承方法继承
和创建对象一样,继承的最好方法就是联合构造函数和原型链继承两种方法,达到高效,功能强大的继承
function newFunction(){
oldFunction.call(this,[“canshu1”,”canshu2”]);
}
function inherit(newFunction,oldFunction){
var prototype=oldFunction.prototype;
prototype.constructor=newFunction;
newFunction.prototype=prototype;
}
inherit(newFunction,oldFuncton);
这种方法可以说堪称完美,思想就是通过构造函数继承属性特别是动态属性,然后通过原型来继承原型,很完美.
实际很多初学者会觉得下面这种方法也行
function newFunction(){
oldFunction.call(this,[“canshu1”,”canshu2”]);
}
newFunction.prototype=new oldFunction();
实际这样继承的所有功能也都能实现,包括动态属性,对象复用,都没问题,但是有一点遗憾:就是你每一次调用此对象,都会调用基函数的两次构造函数,这一点不好.读者可以想想是那两个地方调用了两次