摘要:面向對象的程序設計之繼承繼承的實現借用構造函數前言最近在細讀高級程序設計,對于我而言,中文版,書中很多地方翻譯的差強人意,所以用自己所理解的,嘗試解讀下。繼承了注意,這一段代碼借調了超類型的構造函數。
JS面向對象的程序設計之繼承-繼承的實現-借用構造函數
前言:最近在細讀Javascript高級程序設計,對于我而言,中文版,書中很多地方翻譯的差強人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯誤,會非常感謝您的指出。文中絕大部分內容引用自《JavaScript高級程序設計第三版》。
借用構造函數為了解決原型中包含引用類型值所帶來問題,開發人員開始使用一種叫做借用構造函數(constructor stealing)的技術。
有時候也叫偽造對象或者經典繼承。
這種技術的基本思想非常簡單,即在子類型構造函數內部調用超類型構造函數。
函數只不過是在特定環境中的執行代碼的對象,因此通過使用apply()和call()方法也可以在新創造的對象上執行構造函數。
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"]
注意,這一段代碼“借調”了超類型的構造函數。
function SubType() { //繼承了SuperType SuperType.call(this); }
通過使用call()方法(或apply()方法也可以),實際上是在將要創建的SubType實例對象的環境下調用了SuperType構造函數。
這樣一來,就會在新SubType對象上,執行SuperType()函數中定義的所有對象初始化代碼。
所以,SubType的每個實例對象都有具有自己的colors屬性的副本了。
傳遞參數相對于原型鏈而言,借用構造函數有一個很大的優勢,就是可以在子類型構造函數中向超類型構造函數傳遞參數。
function SuperType(name) { this.name = name; } function SubType(){ //繼承了SuperType,同時還傳遞了參數 SuperType.call(this, "Shaw"); //實例屬性 this.age = 18; } var instance = new SubType(); console.log(instance.name); // "Shaw" console.log(instance.age); // 18
以上代碼中的SuperType只接受一個參數name,該參數會直接賦值給一個屬性。
在SubType構造函數內部調用SuperType構造函數時,實際上是為SubType的實例對象設置了name屬性(this的指向,跟執行上下文有關)。
為了確保SuperType構造函數不會重寫子類型的屬性,可以在調用超類型的構造函數后,再添加應該在子類型中定義的屬性。
借用構造函數的問題如果僅僅是借用構造函數,那么也將無法避免構造函數模式存在的問題。
方法都在構造函數中定義,函數的復用就無從說起了,每實例化一個對象,實質上都在每個實例對象上重新創建了一遍方法, 造成內存和資源的浪費。
而且,在超類型的原型中定義的方法,對子類型而言也是不可見的(因為這里沒用原型對象,實際上子類型的原型鏈指向了Object), 結果所有類型都只能使用構造函數模式。
考慮到這些問題,借用構造函數的技術也是很少多帶帶使用的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/98575.html
摘要:使用原型鏈實現對原型屬性和方法的繼承,用借用構造函數模式實現對實例屬性的繼承。 我們之前介紹了javascript面向對象的封裝的相關內容,還介紹了js的call方法,今天開始討論js的繼承這篇文章參考了《javascript高級程序設計》(第三版),但內容不局限于,網上很多關于js繼承的相關內容都是來自于這本書,有興趣的同學可以翻閱查看 原型鏈繼承 我們先通過一個栗子,了解一下原型鏈...
摘要:實現思路使用原型鏈實現對原型方法和方法的繼承,而通過借用構造函數來實現對實例屬性的繼承。繼承屬性繼承方法以上代碼,構造函數定義了兩個屬性和。 JS面向對象的程序設計之繼承的實現-組合繼承 前言:最近在細讀Javascript高級程序設計,對于我而言,中文版,書中很多地方翻譯的差強人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯誤,會非常感謝您的指出。文中絕大部分內容引用自《Java...
摘要:除此之外,在超類型的原型中定義的方法,對子類型而言也是不可兼得,結果所有類型都只能用構造函數模式。創建對象增強對象指定對象繼承屬性這個例子的高效率體現在它只調用了一次構造函數。 1、原型鏈 原型鏈的基本思想是利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。構造函數、原型和實例的關系:每個構造函數都有一個原型對象;原型對象都包含著一個指向構造函數的指針;實例都包含一個指向原型對象的...
摘要:通常有這兩種繼承方式接口繼承和實現繼承。理解繼承的工作是通過調用函數實現的,所以是寄生,將繼承工作寄托給別人做,自己只是做增強工作。適用基于某個對象或某些信息來創建對象,而不考慮自定義類型和構造函數。 一、繼承的概念 繼承,是面向對象語言的一個重要概念。通常有這兩種繼承方式:接口繼承和實現繼承。接口繼承只繼承方法簽名,而實現繼承則繼承實際的方法。 《JS高程》里提到:由于函數沒有簽名,...
摘要:以下是幾種中實現繼承的方式方法它們也是各自有各自的優缺點選擇哪一種根據自己的應用而定最適合自己的才是最好的通過原型鏈繼承通過原型對象繼承缺點引用類型的值在原型中會被所有實例共享不能向超類的構造函數中傳遞參數借用構造函數繼承借用構造函數繼承是 以下是幾種js中實現繼承的方式方法,它們也是各自有各自的優缺點,選擇哪一種根據自己的應用而定,最適合自己的才是最好的. 通過原型鏈繼承 funct...
閱讀 4122·2022-09-16 13:49
閱讀 1398·2021-11-22 15:12
閱讀 1519·2021-09-09 09:33
閱讀 1039·2019-08-30 13:15
閱讀 1720·2019-08-29 15:30
閱讀 654·2019-08-27 10:52
閱讀 2643·2019-08-26 17:41
閱讀 1896·2019-08-26 12:11