在解決原型中包含引用類型值所帶來問題的過程中,開發人員開始使用一種叫做借用構造函數(constructor stealing)的技術(有時候也叫做 造對象或經 繼 )。這種技術的基本思想相當簡單,即在子類型構造函數的內部調用父類構造函數。別忘了, 函數只不過是在特定環境 中執行代碼的對象,因此通過使用apply()和call()方法也可以在(將來)新創建的對象上執行構造函數,如下所示:
借用構造函數
代碼中加粗的那一部分代碼“借調 ”了父類的構造函數。通過使用call()方法(或apply()方法
也可以),我們實際上是在(未來將要)新創建的SubType實例的環境下調用用了SuperType構造 數。這樣一來,就會在新SubType對象上執行SuperType()函數中定義的所有對象初始化代碼。 結果,SubType的每個實例就都會具有自己的colors性的副本了。
傳遞參數
相對于原型鏈而言,借用構造函數有一個很大的優勢,即可以在子類型的構造函數中向父類型的構造函數傳遞參數:
借用構造函數
? ? 以上代碼中的SuperType只接受一個參數name,該參數會直接賦給一個屬性。在SubType構造函數內部掉用SuperType構造函數時,實際上是為SubType的實例設置了name屬性。為了確保SuperType構造函數不會重寫子類型的屬性,可以在調用父類構造函數后,再添加應該在子類中定義的屬性。
借用構造函數存在的問題:
如果僅僅是使用構造函數,那么也將無法避免構造函數模式存在的問題--- 方法都在構造 數中定義。因此函數復用就無從談起了。而且,在父類的原型中定義的方法,對子類而言也是不可見的,結果所有類型都只能使用構造函數模式。 考慮到這些問題,借用構造函數的技術也是很少單獨使用的。