JavaScript繼承模式粗探
真正意義上來(lái)說(shuō)Javascript并不是一門面向?qū)ο蟮恼Z(yǔ)言,沒(méi)有提供傳統(tǒng)的繼承方式,但是它提供了一種原型繼承的方式,利用自身提供的原型屬性來(lái)實(shí)現(xiàn)繼承。Javascript原型繼承是一個(gè)被說(shuō)爛掉了的話題,但是自己對(duì)于這個(gè)問(wèn)題一直沒(méi)有徹底理解,今天花了點(diǎn)時(shí)間又看了一遍《Javascript模式》中關(guān)于原型實(shí)現(xiàn)繼承的幾種方法,下面來(lái)談?wù)凧S中比較簡(jiǎn)單的繼承方法,如果大家有不同意見(jiàn),歡迎建議。
最基礎(chǔ)的原型鏈繼承在這里就不復(fù)述了,主要講一下其他的繼承模式。
1.借用構(gòu)造函數(shù)繼承
function Father (name) { this.name=name; } function Son (name) { Father.call(this,name); //在子類型中調(diào)用超類型的構(gòu)造函數(shù) this.age=15; } var me=new Son("Su");
好處:可以為子類型傳遞參數(shù),如圖中的name屬性。
壞處:1.方法在構(gòu)造函數(shù)中定義,無(wú)法復(fù)用。2.超類型原型中定義的方法對(duì)子類型是不可見(jiàn)的。
2.組合繼承(綜合原型鏈與構(gòu)造函數(shù))
//超類型構(gòu)造函數(shù)function Father (name) { this.name=name; this.famMember=[]; }//超類型構(gòu)造函數(shù)原型方法 Father.prototype.sayName=function () { alert(this.name); }//子類型構(gòu)造函數(shù) function Son (name,age) { Father.call(this,name); //構(gòu)造函數(shù)方法 this.age=age; } Son.prototype=new Father(); //重寫子類型原型對(duì)象 Son.prototype.constructor=Son; //重寫構(gòu)造函數(shù)屬性指向子類型 Son.prototype.sayAge=function () { alert(this.age); } //重寫原型對(duì)象后再加入方法 var me=new Son("Su",15); me.famMember.push("dad","mom"); //子類型可以調(diào)用超類型構(gòu)造函數(shù)內(nèi)的方法var he=new Son("Li",14);alert(he.famMember); // []
好處:不同的子類既可以擁有自己的屬性,也可以使用相同的方法。
壞處:這種方法需要調(diào)用2次超類型的構(gòu)造函數(shù),同名的屬性方法會(huì)被覆蓋一次。
3.原型式繼承 (類似Object.create())
function object (o) { function F () {} F.prototype=o; return new F(); }var obj={}; //將obj對(duì)象傳入作為新對(duì)象的原型。var me=object(obj);
使用這種方法繼承需要有一個(gè)對(duì)象作為原型對(duì)象,所以所有繼承其的子類型的屬性方法都是共用的。
ES5通過(guò)新增Object.creatr()方法規(guī)范了原型式繼承。
4.寄生式繼承 (可以設(shè)置私有方法的原型式繼承)
function object (o) { function F () {} F.prototype=o; return new F(); } var obj={}; //將obj對(duì)象傳入作為新對(duì)象的原型。到這里都與原型式繼承相同function creObj(o) { var clone=object(obj); clone.sayHi=function () { alert("Hi"); };return clone; } var me=creObj(obj);
好處:這種方式彌補(bǔ)了原型式繼承只有公有屬性方法的缺陷,使子類型能有私有屬性方法。
5.寄生組合式繼承
function inherit (father,son) { var pro=Object(father.prototype); //創(chuàng)建超類型原型對(duì)象的副本 pro.constructor=son; son.prototype=pro; //將副本作為子類型的原型對(duì)象 }
本方法用于彌補(bǔ)組合繼承中屬性方法覆蓋的問(wèn)題。
用上圖代碼代替組合繼承中 Son.prototype=new Father(); 這段代碼。這樣只需調(diào)用一次父類型的構(gòu)造函數(shù),避免了創(chuàng)造多余不必要的屬性方法,并且保持了原型鏈不改變,是一種理想的引用類型繼承方法。
關(guān)于js繼承模式先粗略給大家介紹這么多,相信對(duì)大家有所幫助,更多信息請(qǐng)繼續(xù)關(guān)注腳本之家網(wǎng)站。
相關(guān)文章
JavaScript canvas實(shí)現(xiàn)加載圖片
這篇文章主要為大家詳細(xì)介紹了JavaScript canvas實(shí)現(xiàn)加載圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08中級(jí)前端工程師必須要掌握的27個(gè)JavaScript 技巧(干貨總結(jié))
這篇文章主要介紹了中級(jí)前端工程師必須要掌握的27個(gè)JavaScript 技巧(干貨總結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-09-09微信小程序開(kāi)發(fā)之實(shí)現(xiàn)一個(gè)跑步小程序
本文將開(kāi)發(fā)一個(gè)簡(jiǎn)易的微信跑步小程序,用到的方法是wx.onLocationChange,可以監(jiān)聽(tīng)實(shí)時(shí)地理位置變化事件,感興趣的小伙伴可以了解一下2022-08-08JavaScript實(shí)現(xiàn)答題評(píng)分功能頁(yè)面
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)答題評(píng)分功能頁(yè)面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06JS操作json對(duì)象key、value的常用方法分析
這篇文章主要介紹了JS操作json對(duì)象key、value的常用方法,結(jié)合實(shí)例形式分析了js操作json對(duì)象鍵值對(duì)遍歷及增刪的相關(guān)操作技巧,需要的朋友可以參考下2019-10-10javascript內(nèi)嵌式與外鏈?zhǔn)降幕緫?yīng)用方式
這篇文章主要介紹了javascript內(nèi)嵌式與外鏈?zhǔn)降幕緫?yīng)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12微信小程序轉(zhuǎn)換uniapp的遷移步驟以及遇到的問(wèn)題總結(jié)
最近公司有個(gè)需求,第一次遇到,把原生的微信小程序代碼轉(zhuǎn)換為uni-app項(xiàng)目,下面這篇文章主要給大家介紹了關(guān)于微信小程序轉(zhuǎn)換uniapp的遷移步驟以及遇到問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07