在解決原型中包含引用類型值所帶來問題的過程中,開發(fā)人員開始使用一種叫做借用構造函數(shù)(constructor stealing)的技術(有時候也叫做 造對象或經 繼 )。這種技術的基本思想相當簡單,即在子類型構造函數(shù)的內部調用父類構造函數(shù)。別忘了墩新, 函數(shù)只不過是在特定環(huán)境 中執(zhí)行代碼的對象,因此通過使用apply()和call()方法也可以在(將來)新創(chuàng)建的對象上執(zhí)行構造函數(shù)窟坐,如下所示:
代碼中加粗的那一部分代碼“借調 ”了父類的構造函數(shù)海渊。通過使用call()方法(或apply()方法
也可以),我們實際上是在(未來將要)新創(chuàng)建的SubType實例的環(huán)境下調用用了SuperType構造 數(shù)哲鸳。這樣一來臣疑,就會在新SubType對象上執(zhí)行SuperType()函數(shù)中定義的所有對象初始化代碼。 結果徙菠,SubType的每個實例就都會具有自己的colors性的副本了讯沈。
傳遞參數(shù)
相對于原型鏈而言,借用構造函數(shù)有一個很大的優(yōu)勢婿奔,即可以在子類型的構造函數(shù)中向父類型的構造函數(shù)傳遞參數(shù):
? ? 以上代碼中的SuperType只接受一個參數(shù)name缺狠,該參數(shù)會直接賦給一個屬性。在SubType構造函數(shù)內部掉用SuperType構造函數(shù)時萍摊,實際上是為SubType的實例設置了name屬性挤茄。為了確保SuperType構造函數(shù)不會重寫子類型的屬性,可以在調用父類構造函數(shù)后冰木,再添加應該在子類中定義的屬性穷劈。
借用構造函數(shù)存在的問題:
如果僅僅是使用構造函數(shù),那么也將無法避免構造函數(shù)模式存在的問題--- 方法都在構造 數(shù)中定義踊沸。因此函數(shù)復用就無從談起了囚衔。而且,在父類的原型中定義的方法雕沿,對子類而言也是不可見的练湿,結果所有類型都只能使用構造函數(shù)模式。 考慮到這些問題审轮,借用構造函數(shù)的技術也是很少單獨使用的肥哎。