摘要:以下是幾種中實(shí)現(xiàn)繼承的方式方法它們也是各自有各自的優(yōu)缺點(diǎn)選擇哪一種根據(jù)自己的應(yīng)用而定最適合自己的才是最好的通過原型鏈繼承通過原型對(duì)象繼承缺點(diǎn)引用類型的值在原型中會(huì)被所有實(shí)例共享不能向超類的構(gòu)造函數(shù)中傳遞參數(shù)借用構(gòu)造函數(shù)繼承借用構(gòu)造函數(shù)繼承是
以下是幾種js中實(shí)現(xiàn)繼承的方式方法,它們也是各自有各自的優(yōu)缺點(diǎn),選擇哪一種根據(jù)自己的應(yīng)用而定,最適合自己的才是最好的.
通過原型鏈繼承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();//通過原型對(duì)象繼承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"]
缺點(diǎn):
引用類型的值在原型中會(huì)被所有實(shí)例共享.
不能向超類的構(gòu)造函數(shù)中傳遞參數(shù)
借用構(gòu)造函數(shù)繼承借用構(gòu)造函數(shù)繼承是將超類(SuperType)所有的屬性和方法都寫在構(gòu)造函數(shù)中,最后在函數(shù)(SubType)體內(nèi)通過call方法調(diào)用超類.
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();
缺點(diǎn):方法的定義都存在構(gòu)造函數(shù)中,導(dǎo)致函數(shù)無法被復(fù)用.
組合繼承組合繼承是原型鏈繼承和構(gòu)造函數(shù)繼承的結(jié)合體,結(jié)合了二者的優(yōu)點(diǎn),即實(shí)現(xiàn)了函數(shù)的復(fù)用,也不會(huì)導(dǎo)致引用類型值在多個(gè)實(shí)例中共享.
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();
缺點(diǎn):
超類函數(shù)被執(zhí)行了兩次.
超類構(gòu)造函數(shù)SuperType自身的屬性(name,friends)被重復(fù)定義,即出現(xiàn)在SubType的構(gòu)造函數(shù)中,也出現(xiàn)在SubType的原型對(duì)象中.
原型繼承原型繼承是繼承自一個(gè)對(duì)象而不是引用類型.
function object(obj){ function F(){} F.prototype = obj; return new F(); }
這里的object方法接收obj對(duì)象,并將對(duì)象賦值給一個(gè)空函數(shù)的原型,并返回空函數(shù)的實(shí)例.
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"]
如果不想創(chuàng)建構(gòu)造函數(shù),只想讓一個(gè)對(duì)象和另一個(gè)對(duì)象保持一致的情況下,原型繼承是完全可以勝任的,不過有一點(diǎn)要注意的是,假如繼承的屬性值為引用類型時(shí),還是會(huì)相互影響的.
寄生繼承寄生繼承是基于原型繼承的基礎(chǔ)上擴(kuò)展自己的屬性和方法.
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
寄生繼承也是和原型繼承一樣也是繼承對(duì)象,并產(chǎn)出對(duì)象.
寄生組合繼承顧名思義,寄生組合繼承是集寄生繼承和組合繼承的結(jié)合體,它結(jié)合了二者的優(yōu)點(diǎn).
//繼承Supertype的原型對(duì)象 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的構(gòu)造函數(shù)屬性 SuperType.call(this); this.age = 30; } inheritProtoType(SuperType,SubType); var subType = new SubType();
寄生組合繼承是前面幾種繼承思想碰撞在一起的產(chǎn)物,是執(zhí)行效率最高也是應(yīng)用面最廣的.
總結(jié)原型鏈繼承是通過為原型對(duì)象賦值,不足之處為引用類型值會(huì)被多個(gè)實(shí)例共享,構(gòu)造函數(shù)繼承解決了原型鏈繼承的問題,同時(shí)也暴露出新的問題是函數(shù)的復(fù)用無法實(shí)現(xiàn),然后我們結(jié)合二者的優(yōu)缺點(diǎn),構(gòu)造出了組合繼承,組合繼承基本上滿足了我們想要的繼承結(jié)果.
考慮到執(zhí)行的效率,我們構(gòu)思出了寄生繼承(基于原型繼承),并將寄生繼承和組合繼承結(jié)合,最終得出了繼承的最優(yōu)解決方案"寄生組合繼承.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92340.html
摘要:實(shí)現(xiàn)思路使用原型鏈實(shí)現(xiàn)對(duì)原型方法和方法的繼承,而通過借用構(gòu)造函數(shù)來實(shí)現(xiàn)對(duì)實(shí)例屬性的繼承。繼承屬性繼承方法以上代碼,構(gòu)造函數(shù)定義了兩個(gè)屬性和。 JS面向?qū)ο蟮某绦蛟O(shè)計(jì)之繼承的實(shí)現(xiàn)-組合繼承 前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯(cuò)誤,會(huì)非常感謝您的指出。文中絕大部分內(nèi)容引用自《Java...
摘要:那你們肯定會(huì)問為什么共用,而沒有共用呢,下面就給你解釋,請(qǐng)看引用類型是共用的值類型是私用的。 引言 面向?qū)ο蟮木幊陶Z言都具繼承這一機(jī)制,而 JavaScript 是基于原型(Prototype)面向?qū)ο蟪绦蛟O(shè)計(jì),所以它的實(shí)現(xiàn)方式也是基于原型(Prototype)實(shí)現(xiàn)的. 繼承的方式 類式繼承 構(gòu)造函數(shù)繼承 組合繼承 原型式繼承 寄生式繼承 寄生組合式繼承 1.類式繼承 //聲明父...
摘要:之前,本質(zhì)上不能算是一門面向?qū)ο蟮木幊陶Z言,因?yàn)樗鼘?duì)于封裝繼承多態(tài)這些面向?qū)ο笳Z言的特點(diǎn)并沒有在語言層面上提供原生的支持。所以在中出現(xiàn)了等關(guān)鍵字,解決了面向?qū)ο笾谐霈F(xiàn)了問題。 ES6之前,javascript本質(zhì)上不能算是一門面向?qū)ο蟮木幊陶Z言,因?yàn)樗鼘?duì)于封裝、繼承、多態(tài)這些面向?qū)ο笳Z言的特點(diǎn)并沒有在語言層面上提供原生的支持。但是,它引入了原型(prototype)的概念,可以讓我們以...
摘要:簡單回顧一下構(gòu)造函數(shù)原型和實(shí)例對(duì)象之間的關(guān)系每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象。找到生成構(gòu)造函數(shù)的原型對(duì)象的構(gòu)造函數(shù),搜索其原型對(duì)象,找到了。 JS面向?qū)ο蟮某绦蛟O(shè)計(jì)之繼承的實(shí)現(xiàn) - 原型鏈 前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯(cuò)誤,會(huì)非常感謝您的指出。文中絕大部分內(nèi)容引用自《JavaS...
摘要:面向?qū)ο蟮某绦蛟O(shè)計(jì)之繼承繼承的實(shí)現(xiàn)借用構(gòu)造函數(shù)前言最近在細(xì)讀高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下。繼承了注意,這一段代碼借調(diào)了超類型的構(gòu)造函數(shù)。 JS面向?qū)ο蟮某绦蛟O(shè)計(jì)之繼承-繼承的實(shí)現(xiàn)-借用構(gòu)造函數(shù) 前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下...
摘要:二面向?qū)ο笥惺裁刺卣髅嫦驅(qū)ο蟮闹饕卣饔谐橄罄^承封裝和多態(tài)。析構(gòu)函數(shù)析構(gòu)函數(shù)是在引入的,它的作用與調(diào)用時(shí)機(jī)和構(gòu)造函數(shù)剛好相反,它在對(duì)象被銷毀時(shí)自動(dòng)執(zhí)行。 PHP面試專欄正式起更,每周一、三、五更新,提供最好最優(yōu)質(zhì)的PHP面試內(nèi)容。PHP中面向?qū)ο蟪?嫉闹R(shí)點(diǎn)有以下7點(diǎn),我將會(huì)從以下幾點(diǎn)進(jìn)行詳細(xì)介紹說明,幫助你更好的應(yīng)對(duì)PHP面試??嫉拿嫦?qū)ο笙嚓P(guān)的知識(shí)點(diǎn)和考題。整個(gè)面向?qū)ο笪恼碌慕Y(jié)構(gòu)涉...
閱讀 2120·2021-11-24 09:39
閱讀 1503·2019-08-30 15:44
閱讀 1954·2019-08-29 17:06
閱讀 3406·2019-08-29 16:32
閱讀 3552·2019-08-29 16:26
閱讀 2662·2019-08-29 15:35
閱讀 3033·2019-08-29 12:50
閱讀 1646·2019-08-29 11:15