js中实现继承6种方法总结

来源:互联网 发布:java线程教程 编辑:程序博客网 时间:2024/05/17 08:12

一般实现继承有两种方式:接口继承、实现继承,javascript只支持实现继承。

原型链继承

原理:构造函数的实例对象等于另一个构造函数的原型。
例如:
function SuperType(){}
function SubType(){}
SubType.prototype=new SuperType();
即SubType继承了SuperType,SuperType的实例对象属性和方法称为SubType原型的属性和方法。
访问时经历三个步骤:
1.子类实例;
2子类原型;
3.超类原型。
存在问题:
1.共享性导致(改变原型属性和方法会影响所有实例对象);
2.创建子类型实例不能向超类型的构造函数传递参数(不能在没有影响所有对象实例的情况下给超类构造函数传参)。

借用构造函数继承

原理:在子类型构造函数的内部调用超类构造函数(apply()、call())。
例如:
function SuperType(){}
function SubType(){SuperType.call(this);}
在子类构造函数中调用超类构造函数,使得子类中有超类的一个副本,利用子类型创建对象时就有不同的超类副本,并且利用this将子类对象传入超类,使得超类中的this指向子类对象,超类中的属性方法绑定到子类。
存在问题:无法避免函数复用问题(即无法实现共享)。

组合式继承(伪经典继承)

原理:结合原型链(共享)和构造函数继承(子类构造函数的实例对象对超类的属性方法继承)两种优点,弥补了原型链中“修一改全”的问题和构造函数继承中无法解决方法复用问题。
例如:
function SuperType(name){this.name=name;}//超类构造函数
SuperType.prototype.SayName=function(){alert(this.name);};//超类原型
function SubType(name,age){ //子类构造函数
SuperType.call(this,name);//第二次调用超类构造函数
this.age=age;
}
SubType.prototype=new SuperType();//第一次调用超类构造函数
SubType.prototype.constructor=SubType;
存在问题:2次调用超类构造函数。

原型式继承

原理:一个对象作为另一个对象的基础。
继承模式如下:
function object(o){
function F(){}
F.prototype=o;
return new F();
}
ES5中规范了此方法:Object.create()//IE9+,FireFox4+,Safari5+,Opera12+,Chrome
存在问题:共享基础对象属性,基础对象属性改变则子类对象实例将会受影响。

寄生式继承

原理:基于原型式继承的方法
继承模式如下:
function createSub(Super){
var clone=object(Super);
clone.sayHi=function(){alert(“hi”);};
return clone;
}
存在问题:无法解决函数复用问题,与构造函数继承类似。

寄生式组合继承

原理:借用构造函数来继承超类属性,通过原型链的混成形式来继承方法,不必为了子类型的原型而调用超类型的构造函数,需要的只是超类型原型的一个副本而已。
继承模式如下:
function inheritPrototype(SubType,SuperType){
var prototype=object(SuperType.prototype);//创建对象
prototype.constructor=SubType;//增强对象
SubType.prototype=prototype;//指定对象
}
inheritPrototype(SubType,SuperType)替换组合式继承中的如下代码:

SubType.prototype=new SuperType();
SubType.prototype.constructor=SubType;

即减少一次超类构造函数的调用。
评价:近乎理想的继承方式。

2 0
原创粉丝点击