基本思想
在子類(lèi)型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類(lèi)型構(gòu)造函數(shù)辅髓。使用apply()和call()方法可以在(將來(lái))新創(chuàng)建的對(duì)象上執(zhí)行構(gòu)造函數(shù)缎罢。
function SuperType(){
this.color=["red","blue","green"];
}
function SubType(){
//繼承了SuperType
SuperType.call(this);
}
var instance1 = new SubType();
instance1.color.push("black");
alert(instance1.color); //red,blue,green,black
var instance2 = new SubType();
alert(instance2.color); //red,blue,green
實(shí)際上是在(未來(lái)將要)新創(chuàng)建的SubType實(shí)例的環(huán)境下調(diào)用了SuperType構(gòu)造函數(shù)。這樣一來(lái)饼问,就會(huì)在新SubType對(duì)象上執(zhí)行SuperType()函數(shù)中定義的所有對(duì)象初始化代碼影兽。結(jié)果,SubType的每個(gè)實(shí)例就會(huì)具有自己的color屬性的副本了莱革。
傳遞參數(shù)
相對(duì)于原型鏈峻堰,借用構(gòu)造函數(shù)有一個(gè)很大的優(yōu)勢(shì):
可以在子類(lèi)型構(gòu)造函數(shù)中向超類(lèi)型構(gòu)造函數(shù)傳遞參數(shù)。
function SuperType(name){
this.name = name;
}
function SubType(){
//繼承了SuperType盅视,同時(shí)還傳遞了參數(shù)
SuperType.call(this,"Wonder");
//實(shí)例屬性
this.age = 23;
}
var instance1 = new SubType();
alert(instance1.name); //"Wonder"
alert(instance1.age); //23
借用構(gòu)造函數(shù)的問(wèn)題
方法都在構(gòu)造函數(shù)中定義捐名,因此無(wú)法函數(shù)復(fù)用。而且闹击,在超類(lèi)型的原型中定義的方法镶蹋,對(duì)于子類(lèi)型而言也是不可見(jiàn)的,結(jié)果所有類(lèi)型都只能使用構(gòu)造函數(shù)模式赏半。