尽管JavaScript没有给出继承的关键字,但我们仍然可以想出一些好的方法来实现它们。
1、原型链继承:
复制代码如下: varbase=function () {this。level=1;this.name=' basethis . ToString=function(){ return ' base ';};};基地。常数='常数';var Sub=function(){ };子原型=新基础();sub . prototype . name=' sub ';
优点:从关键字instanceof来看,实例不仅是父类的实例,也是子类的实例,这似乎是最纯粹的继承。
缺点:子类不同于父类的属性和方法,必须在sub prototype=new Base();这样的语句是单独执行的,不能包装在构造函数Sub中。示例:sub . prototype . name=" sub ";多重继承无法实现。
2.结构继承:
复制代码如下: varbase=function () {this。level=1;this.name=' basethis . ToString=function(){ return ' base ';};};基地。常数='常数';var Sub=function(){ base . call(this);this.name=' sub};
优点:可以实现多重继承,子类的特殊属性设置可以放在构造函数内部。
缺点:使用instanceof发现,对象不是父类的实例。
3.实例继承:
复制代码如下: varbase=function () {this。level=1;this.name=' basethis . ToString=function(){ return ' base ';};};基地。常数='常数';var Sub=function(){ var instance=new Base();instance.name=' sub返回实例;};
优点:是父类的对象,用new构造对象和不用new构造对象可以得到同样的效果。
缺点:生成的对象只是父类的一个实例,不是子类对象;不支持多重继承。
4.复制继承:
复制代码如下: varbase=function () {this。level=1;this.name=' basethis . ToString=function(){ return ' base ';};};基地。常数='常数';var Sub=function(){ var Base=new Base();对于(基础中的变量I)子原型[i]=基础[I];sub . prototype[' name ']=' sub ';};
优点:支持多重继承。
缺点:效率低;无法获取父类的不可枚举方法。
这些形式各有特点。就我提供的代码而言,它们符合下表:
2012-1-10:补充,如果不需要类继承,只需要对象继承。对于支持ECMAScript 5的浏览器,我们也可以使用Object.create方法来实现这一点:
复制代码如下: varbase=function () {this。level=1;this.name=' basethis . ToString=function(){ return ' base ';};};基地。常数='常数';var sub=Object.create(新的Base());sub.name=' sub