我们都知道js的继承有几种方法:
- 借用构造函数
- 组合继承
- 原型式继承
- 寄生式继承
- 寄生组合式继承
第四五种是前三种的变通。
下面主要讲解前三种。
1. 借用构造函数
即在子类型构造函数中通过调用apply和call方法实现继承。
function SuperType(name){
this.name=name;
}
function SubType(){
SuperType.call(this,"Nicholas");
this.age=29;
}
var instance=new SubType();
缺点:
- 在父类的原型上定义的函数在子类中都不可见。变成了静态继承。
- 方法都在构造函数中定义,函数无法复用。
2. 组合继承
原型链和构造函数相结合的方式
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;
SubType.prototype.sayName=function (){
alert(this.age);
}
核心代码是:
SubType.prototype=new SuperType();
SubType.prototype.constructor=SubType;
3. 原型式继承
function SuperType(name){
this.name=name;
}
SuperType.prototype.sayName=function(){
alert(this.name);
}
function SubType(age){
this.age=age;
}
SubType.prototype=Object.create(SuperType.prototype);
SubType.prototype.constructor=SubType;
核心代码是:
SubType.prototype=Object.create(SuperType.prototype);
SubType.prototype.constructor=SubType;
其中Object.create方法是es5中的功能。若是兼容es5之前的版本。就模拟一个吧
if(!Object.create){
Object.create=function(proto){
function F(){};
F.prototype=proto;
return new F;
}
}
注意:SubType.prototype=SuperType.prototype是万万不可的。
这样若是更改SubType原型方法,SuperType的原型方法也会随之改变,因为他们公用的一个原型。
要实现继承,一定要新建一个空对象,它的原型指向父类的原型。子类的constructor指向新对象。