上一篇讲了原形链的继承法,原形链继承存在一个问题,那就是继承之后子实例1改写了父构造的方法或者属性,子实例2也会体现出来。如下
function Parent(){
this.color=['red','blue','yellow'];
}
function Sub(){
}
Sub.prototype=new Parent();
var sub1=new Sub();
sub1.color.push("green");
alert(sub1.color);//red,blue,yellow,green
var sub2=new Sub();
alert(sub2.color);//red,blue,yellow,green
第二个问题是没有办法在子实例中向父构造传递参数
构造函数继承的思想是在在子构造函数内部调用父构造函数(通过call或者apply方法)
function SuperType(){
this.color=['red','green'];
}
function Sub(){\
//继承了父类
SuperType.apply(this);
}
var sub1 = new Sub();
sub1.color.push('black');
var sub2 = new Sub();
alert(sub1.color);//red,green,black
alert(sub2.color);//red,green
可见构造函数继承法解决了原形链继承中的实例,原型紧耦合的问题,每个实例都有自己的副本,下面是一个子构造函数向父构造传递参数的例子
function SuperType(name){
this.name=name;
}
function SubType(){
SuperType.apply(this,"mary");
}
var sub1=new SubType();
alert(sub1.name);//marry