簡(jiǎn)單談?wù)凧avaScript寄生式組合繼承
組合繼承
組合繼承也被稱為偽經(jīng)典繼承,它綜合了我們昨天說(shuō)的原型鏈和盜用構(gòu)造函數(shù),將倆者的有點(diǎn)結(jié)合在了一起。它的基本思想是使用原型鏈繼承原型上的屬性和方法,通過(guò)盜用構(gòu)造函數(shù)繼承實(shí)例屬性,這樣的好處就是可以把方法定義在原型上復(fù)用,每個(gè)實(shí)例又有自己的屬性。
function SuperType (name) { this.name = name; this.colors = ["red","yellow","bule"]; } SuperType.prototype.sayName = function(){ console.log(this.name) } function SubType(name,age){ SuperType.call(this,name); this.age = age; } SubType.prototype = new SuperType(); SubType.prototype.sayAge = function(){ console.log(this.age); } let instancel = new SubType("jackson",22); instancel.colors.push("pink"); instancel.sayName(); // "jackson" instancel.sayAge();//22 console.log(instancel.colors);// ["red", "yellow", "bule", "pink"] let instance2 = new SubType("bear", 20); console.log(instance2.colors); // ["red", "yellow", "bule"] instance2.sayName(); // "bear"; instance2.sayAge(); // 20
上面的代碼大家有沒(méi)有一種豁然開朗的感覺,SubType調(diào)用SuperType,并且傳入name,然后定義自己的屬性age,此外SubType.prototype也被賦值位SuperType實(shí)例。原型賦值后又在這個(gè)原型上添加sayage方法,這樣創(chuàng)建倆個(gè)subType實(shí)例,這倆個(gè)實(shí)例都有自己屬性,還可以共享相同的方法。
組合繼承彌補(bǔ)了原型鏈和盜用構(gòu)造函數(shù)的不足,是js中使用最多的繼承模式。
寄生式繼承
寄生式繼承就是用一個(gè)函數(shù)包裝一個(gè)對(duì)象,然后返回這個(gè)函數(shù)的調(diào)用,這個(gè)函數(shù)就變成了個(gè)可以隨意增添屬性的實(shí)例或?qū)ο?。object.create()就是這個(gè)原理。
// 寄生式繼承 function subobject(obj) { let clone = Object(obj); clone.sayName = function(){ console.log("jackson") }; return clone; } let sub = { name:"bear" } let sup = subobject(sub); sup.sayName();//jackson
這個(gè)例子基于sub對(duì)象返回一個(gè)新對(duì)象,返回的sup對(duì)象有sub的屬性和方法,還有一個(gè)新方法sayName()。
寄生式繼承同樣適合主要關(guān)注對(duì)象,而不在乎類型和構(gòu)造函數(shù)的場(chǎng)景。object()函數(shù)不是寄生式繼承所必需的,任何返回新對(duì)象的函數(shù)都可以在這里使用。
注意 通過(guò)寄生式繼承給對(duì)象添加函數(shù)會(huì)導(dǎo)致函數(shù)難以重用,與構(gòu)造函數(shù)模式類似。
寄生式組合繼承
組合繼承存在這一定的效率問(wèn)題,它的父類構(gòu)造函數(shù)始終會(huì)被調(diào)用倆次,一次在創(chuàng)建字類原型時(shí)調(diào)用,另一次在子類構(gòu)造函數(shù)中調(diào)用。本質(zhì)上子類只需要在執(zhí)行時(shí)重寫自己的原型就行了。
function inheritPrototype(subType, superType) { let prototype = Object(superType.prototype); // 創(chuàng)建對(duì)象 prototype.constructor = subType; // 增強(qiáng)對(duì)象 subType.prototype = prototype; // 賦值對(duì)象 }
這個(gè) inheritPrototype()函數(shù)實(shí)現(xiàn)了寄生式組合繼承的核心邏輯。這個(gè)函數(shù)接收兩個(gè)參數(shù):子類構(gòu)造函數(shù)和父類構(gòu)造函數(shù)。在這個(gè)函數(shù)內(nèi)部,第一步是創(chuàng)建父類原型的一個(gè)副本。然后,給返回的 prototype 對(duì)象設(shè)置 constructor 屬性,解決由于重寫原型導(dǎo)致默認(rèn) constructor 丟失的問(wèn)題。最后將新創(chuàng)建的對(duì)象賦值給子類型的原型。如下例所示,調(diào)用 inheritPrototype()就可以實(shí)現(xiàn)前面例子中的子類型原型賦值:
function SuperType(name) { this.name = name; this.colors = ["red", "blue", "green"]; } SuperType.prototype.sayName = function () { console.log(this.name); }; function SubType(name, age) { SuperType.call(this, name); this.age = age; } inheritPrototype(SubType, SuperType); SubType.prototype.sayAge = function () { console.log(this.age); };
這里只調(diào)用了一次 SuperType 構(gòu)造函數(shù),避免了 SubType.prototype 上不必要也用不到的屬性, 因此可以說(shuō)這個(gè)例子的效率更高。而且原型鏈仍然保持不變。
總結(jié)
到此這篇關(guān)于JavaScript寄生式組合繼承的文章就介紹到這了,更多相關(guān)JS寄生式組合繼承內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript學(xué)習(xí)筆記(七)利用javascript來(lái)創(chuàng)建和存儲(chǔ)cookie
今天把javascript如何用來(lái)創(chuàng)建及存儲(chǔ)cookie復(fù)習(xí)了一下,其中的一點(diǎn)體會(huì)拿出來(lái)和大家討論,懇請(qǐng)高手指點(diǎn)一二。2011-04-04js實(shí)現(xiàn)input框文字動(dòng)態(tài)變換顯示效果
這篇文章主要介紹了js實(shí)現(xiàn)input框文字動(dòng)態(tài)變換顯示效果,涉及javascript隨機(jī)字符串與中文的動(dòng)態(tài)切換顯示效果,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08el-popover放在el-table中點(diǎn)擊無(wú)反應(yīng)問(wèn)題解決方案
我們想在table中給btn加彈框但是?el-popover點(diǎn)擊按鈕沒(méi)有任何反應(yīng),解決思路是通過(guò)給每個(gè)el-popover都加上單獨(dú)的id,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2024-04-04js實(shí)現(xiàn)按Ctrl+Enter發(fā)送效果
按Ctrl+Enter發(fā)送,思路是監(jiān)聽textarea的onkeydown事件,當(dāng)ctrl鍵被按下,并且,keycode為13(回車),時(shí),調(diào)用發(fā)送表單的函數(shù)2014-09-09javascript中導(dǎo)出與導(dǎo)入實(shí)現(xiàn)模塊化管理教程
這篇文章主要給大家介紹了關(guān)于javascript中導(dǎo)出與導(dǎo)入實(shí)現(xiàn)模塊化管理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12針對(duì)BootStrap中tabs控件的美化和完善(推薦)
這篇文章主要介紹了針對(duì)BootStrap中tabs控件的美化和完善的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-07-07Javascript的數(shù)組與字典用法與遍歷對(duì)象的技巧
Javascript 的數(shù)組Array,既是一個(gè)數(shù)組,也是一個(gè)字典(Dictionary)。先舉例看看數(shù)組的用法2012-11-11淺談layui數(shù)據(jù)表格判斷問(wèn)題(加入表單元素),設(shè)置單元格樣式
今天小編就為大家分享一篇淺談layui數(shù)據(jù)表格判斷問(wèn)題(加入表單元素),設(shè)置單元格樣式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10