摘要:以下是幾種中實現繼承的方式方法它們也是各自有各自的優缺點選擇哪一種根據自己的應用而定最適合自己的才是最好的通過原型鏈繼承通過原型對象繼承缺點引用類型的值在原型中會被所有實例共享不能向超類的構造函數中傳遞參數借用構造函數繼承借用構造函數繼承是
以下是幾種js中實現繼承的方式方法,它們也是各自有各自的優缺點,選擇哪一種根據自己的應用而定,最適合自己的才是最好的.
通過原型鏈繼承function SuperType(){ this.name = "yahualingfeng"; } SuperType.prototype.friends = ["David","Bob","Lucy"]; SuperType.prototype.sayName = function(){ alert(this.name); }; function SubType(){ this.age = 30; } SubType.protoType = new SuperType();//通過原型對象繼承SuperType var subType1 = new SubType(); var subType2 = new SubType(); subType1.friends.push("Jake"); console.log(subType1.friends); // ["David","Bob","Lucy","Jake"] console.log(subType2.friends); // ["David","Bob","Lucy","Jake"]
缺點:
引用類型的值在原型中會被所有實例共享.
不能向超類的構造函數中傳遞參數
借用構造函數繼承借用構造函數繼承是將超類(SuperType)所有的屬性和方法都寫在構造函數中,最后在函數(SubType)體內通過call方法調用超類.
function SuperType(){ this.name = "yuhualingfeng"; this.friends =["David","Bob","Lucy"]; this.sayName = function(){ alert(this.name); } } function SubType(){ SuperType.call(this); } var subType = new SubType(); subType.sayName();
缺點:方法的定義都存在構造函數中,導致函數無法被復用.
組合繼承組合繼承是原型鏈繼承和構造函數繼承的結合體,結合了二者的優點,即實現了函數的復用,也不會導致引用類型值在多個實例中共享.
function SuperType(){ this.name="yuhualingfeng"; this.friends=["David","Bob","Lucy"]; } SuperType.prototype.sayName = function(){ alert(this.name); }; function SubType(){ SuperType.call(this); } SubType.prototype = new SuperType(); var subType = new SubType();
缺點:
超類函數被執行了兩次.
超類構造函數SuperType自身的屬性(name,friends)被重復定義,即出現在SubType的構造函數中,也出現在SubType的原型對象中.
原型繼承原型繼承是繼承自一個對象而不是引用類型.
function object(obj){ function F(){} F.prototype = obj; return new F(); }
這里的object方法接收obj對象,并將對象賦值給一個空函數的原型,并返回空函數的實例.
var person = { name:"yuhualingfeng", friends:["David","Bob","Lucy"] }; var anotherPerson = object(person); anotherPerson.name = "Jake"; anotherPerson.friends.push("Marry"); console.log(anotherPerson.friends); //["David","Bob","Lucy","Marry"] console.log(person.friends); //["David","Bob","Lucy","Marry"]
如果不想創建構造函數,只想讓一個對象和另一個對象保持一致的情況下,原型繼承是完全可以勝任的,不過有一點要注意的是,假如繼承的屬性值為引用類型時,還是會相互影響的.
寄生繼承寄生繼承是基于原型繼承的基礎上擴展自己的屬性和方法.
function createrAnother(obj){ var clone = object(obj); clone.sayHi=function(){ alert("Hi!"); } return clone; } var person = { name:"yuhualingfeng" }; var anotherPerson = createAnother(person); anohterPerson.sayHi(); // Hi
寄生繼承也是和原型繼承一樣也是繼承對象,并產出對象.
寄生組合繼承顧名思義,寄生組合繼承是集寄生繼承和組合繼承的結合體,它結合了二者的優點.
//繼承Supertype的原型對象 function inheritProtoType(SuperType,SubType){ var prototype = object(SuperType.prototype); prototype.constructor = SubType; SubType.prototype = prototype; } function SuperType(){ this.name = "yuhualingfeng"; this.friends = ["David","Bob","Lucy"]; } function SubType(){ ////繼承Supertype的構造函數屬性 SuperType.call(this); this.age = 30; } inheritProtoType(SuperType,SubType); var subType = new SubType();
寄生組合繼承是前面幾種繼承思想碰撞在一起的產物,是執行效率最高也是應用面最廣的.
總結原型鏈繼承是通過為原型對象賦值,不足之處為引用類型值會被多個實例共享,構造函數繼承解決了原型鏈繼承的問題,同時也暴露出新的問題是函數的復用無法實現,然后我們結合二者的優缺點,構造出了組合繼承,組合繼承基本上滿足了我們想要的繼承結果.
考慮到執行的效率,我們構思出了寄生繼承(基于原型繼承),并將寄生繼承和組合繼承結合,最終得出了繼承的最優解決方案"寄生組合繼承.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92340.html
摘要:實現思路使用原型鏈實現對原型方法和方法的繼承,而通過借用構造函數來實現對實例屬性的繼承。繼承屬性繼承方法以上代碼,構造函數定義了兩個屬性和。 JS面向對象的程序設計之繼承的實現-組合繼承 前言:最近在細讀Javascript高級程序設計,對于我而言,中文版,書中很多地方翻譯的差強人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯誤,會非常感謝您的指出。文中絕大部分內容引用自《Java...
摘要:那你們肯定會問為什么共用,而沒有共用呢,下面就給你解釋,請看引用類型是共用的值類型是私用的。 引言 面向對象的編程語言都具繼承這一機制,而 JavaScript 是基于原型(Prototype)面向對象程序設計,所以它的實現方式也是基于原型(Prototype)實現的. 繼承的方式 類式繼承 構造函數繼承 組合繼承 原型式繼承 寄生式繼承 寄生組合式繼承 1.類式繼承 //聲明父...
摘要:之前,本質上不能算是一門面向對象的編程語言,因為它對于封裝繼承多態這些面向對象語言的特點并沒有在語言層面上提供原生的支持。所以在中出現了等關鍵字,解決了面向對象中出現了問題。 ES6之前,javascript本質上不能算是一門面向對象的編程語言,因為它對于封裝、繼承、多態這些面向對象語言的特點并沒有在語言層面上提供原生的支持。但是,它引入了原型(prototype)的概念,可以讓我們以...
摘要:簡單回顧一下構造函數原型和實例對象之間的關系每個構造函數都有一個原型對象。找到生成構造函數的原型對象的構造函數,搜索其原型對象,找到了。 JS面向對象的程序設計之繼承的實現 - 原型鏈 前言:最近在細讀Javascript高級程序設計,對于我而言,中文版,書中很多地方翻譯的差強人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯誤,會非常感謝您的指出。文中絕大部分內容引用自《JavaS...
摘要:面向對象的程序設計之繼承繼承的實現借用構造函數前言最近在細讀高級程序設計,對于我而言,中文版,書中很多地方翻譯的差強人意,所以用自己所理解的,嘗試解讀下。繼承了注意,這一段代碼借調了超類型的構造函數。 JS面向對象的程序設計之繼承-繼承的實現-借用構造函數 前言:最近在細讀Javascript高級程序設計,對于我而言,中文版,書中很多地方翻譯的差強人意,所以用自己所理解的,嘗試解讀下...
摘要:二面向對象有什么特征面向對象的主要特征有抽象繼承封裝和多態。析構函數析構函數是在引入的,它的作用與調用時機和構造函數剛好相反,它在對象被銷毀時自動執行。 PHP面試專欄正式起更,每周一、三、五更新,提供最好最優質的PHP面試內容。PHP中面向對象常考的知識點有以下7點,我將會從以下幾點進行詳細介紹說明,幫助你更好的應對PHP面試常考的面向對象相關的知識點和考題。整個面向對象文章的結構涉...
閱讀 2114·2021-11-24 09:39
閱讀 1501·2019-08-30 15:44
閱讀 1949·2019-08-29 17:06
閱讀 3399·2019-08-29 16:32
閱讀 3547·2019-08-29 16:26
閱讀 2659·2019-08-29 15:35
閱讀 3030·2019-08-29 12:50
閱讀 1640·2019-08-29 11:15