js中的继承方法

继承是面向对象编程中很重要的一个概念,通过继承可以把父类中的属性和方法传递到子类中,就像是『财产继承』;

原型链继承

由于原型链的特性,只需要在子类的原型链上加入父类的属性和方法,子类就自动能够访问这些属性和方法,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function SuperType(){
this.property = true;
}

SuperType.prototype.getSuperValue = function(){
return this.property;
};

function SubType(){
this.subproperty = false;
}

//继承了 SuperType
SubType.prototype = new SuperType();
SubType.prototype.getSubValue = function (){
return this.subproperty;
};

var instance = new SubType();
alert(instance.getSuperValue()); //true

一般是通过将父类的实例赋予给子类的原型(prototype),从而将父类的属性和方法加入至原型中;

疑问:一般而言,一个构造函数的原型(prototype)的构造器(constructor)会指向本身,但是如果该构造函数作为子类按照上述方法改变原型,其原型的构造器便指向了其父类的构造器;

借用构造函数

通过callapply函数的特性,调用父类构造函数,将子类作为this参数传入,从而将父类的属性和方法绑定到子类,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function SuperType(){
this.colors = ["red", "blue", "green"];
}

function SubType(){
//继承了 SuperType
SuperType.call(this);
}

var instance1 = new SubType();
instance1.colors.push("black");
console.log(instance1.colors); //"red,blue,green,black"
var instance2 = new SubType();
console.log(instance2.colors); //"red,blue,green"

组合继承

组合继承(combination inheritance),有时候也叫做伪经典继承,指的是将原型链和借用构造函数的技组合到一块,从而发挥二者之长的一种继承模式。其背后的思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承(传入参数)。这样,既通过在原型上定义方法实现了函数复用,又能够保证每个实例都有它自己的属性。