聊聊JavaScript如何實(shí)現(xiàn)繼承及特點(diǎn)
“繼承”是面向?qū)ο缶幊汤锩娼?jīng)常提及到的概念,它的目的是實(shí)現(xiàn)代碼復(fù)用。JavaScript并沒(méi)有“類”的概念,那么,它如何實(shí)現(xiàn)繼承呢?
(ES6有關(guān)鍵字class和extend,繼承的語(yǔ)法與Java等面向?qū)ο笳Z(yǔ)言類似,但是,ES6 class,只是JavaScript原型繼承的語(yǔ)法糖而已)
1. 類式繼承
關(guān)鍵點(diǎn):通過(guò)構(gòu)造函數(shù)實(shí)現(xiàn)繼承。
父類:
function Parent(name) { this.name = name || "parent"; } Parent.prototype.say = function() { return this.name; }
子類:
function Child() {}
(1) 父類對(duì)象繼承
Child.prototype = new Parent("child"); var child = new Child(); child.say(); // "child"
特點(diǎn):使用這種繼承模式,子類不僅僅會(huì)繼承父類原型上的方法/屬性,還會(huì)繼承父類自身的屬性。
這種模式的缺點(diǎn)是,在初始化父類對(duì)象指向給子類原型時(shí),并不確定父類構(gòu)造函數(shù)的初始化參數(shù)(Child.prototype = new Parent("child");),而且,往往這些參數(shù)并不是子類需要的。
(2) 借用構(gòu)造函數(shù)
改造子類:
function Child(){ Parent.apply(this, arguments); }
特點(diǎn):使用這種繼承模式,子類只會(huì)繼承父類自身的屬性。
缺點(diǎn)很明顯,它無(wú)法從原型鏈中繼承任何方法/屬性。
(3) 共享原型
Child.prototype = Parent.prototype;
這種方式的缺點(diǎn)是,子類原型和父類原型共享一個(gè)對(duì)象,那么,子類如果修改原型,必然會(huì)影響父類。
(4) 臨時(shí)構(gòu)造函數(shù)
function inherit(Child, Parent) { var F = function(){}; F.prototype = Parent.prototype; Child.prototype = new F(); }
特點(diǎn):利用一個(gè)空函數(shù)F()充當(dāng)子類和父類之間的代理,既可以實(shí)現(xiàn)父類原型方法/屬性的繼承,又可以在子類原型上繼續(xù)擴(kuò)展方法/屬性。
一般,我們可以利用ES5提供的新方法Object.create()
來(lái)實(shí)現(xiàn)此類繼承。
Child.prototype = Object.create(Parent.prototype);
2. 通過(guò)復(fù)制屬性實(shí)現(xiàn)繼承
復(fù)制屬性分為淺拷貝和深拷貝。
淺拷貝不會(huì)復(fù)制對(duì)象類型,只會(huì)簡(jiǎn)單的將對(duì)象引用指向子類,代碼如下:
function extend(parent, child) { var key; for(key in parent) { if (parent.hasOwnProperty(key)){ child[key] = parent[key]; } } return child; }
深拷貝會(huì)做深度復(fù)制,如果某個(gè)屬性為對(duì)象類型,那么,它會(huì)復(fù)制出該對(duì)象的屬性,再拷貝給子類。代碼如下:
function extendDeep(parent, child) { var key; for(key in parent) { if (parent.hasOwnProperty(key)){ if (typeof parent[key] === 'object') { child[key] = (parent[key].toString() === "[object Array]")? []:{}; extendDeep(parent[key], child[key]); } else { child[key] = parent[key]; } } } return child; }
3. "借用方法"模式復(fù)用父類函數(shù)
如果不想實(shí)現(xiàn)父子之間的完全繼承,僅僅期望子類實(shí)現(xiàn)父類中一個(gè)或多個(gè)方法,那么可以利用apply, call, bind
來(lái)調(diào)用父類函數(shù),實(shí)現(xiàn)復(fù)用。
代碼如下:
parent.say.call(child, "hello, child!");
小結(jié)
推薦采用“臨時(shí)構(gòu)造函數(shù)”模式實(shí)現(xiàn)繼承。以上所述是小編給大家介紹的JavaScript如何實(shí)現(xiàn)繼承,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
HTML+JavaScript模擬實(shí)現(xiàn)簡(jiǎn)單的時(shí)鐘效果
在這篇文章中,主要將向大家展示如何使用?HTML、CSS?和?JavaScript代碼制作模擬時(shí)鐘,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-08-08javascript 得到文件后綴名的思路及實(shí)現(xiàn)
在上傳文件時(shí),常常要對(duì)文件的類型即對(duì)文件的后綴名進(jìn)行判斷,用javascript可以很容易的做到這一點(diǎn)。用Javascript解析一個(gè)帶絕對(duì)路徑的文件名并得到后綴名的方法有很多種,這里列出一種,以供參考。2013-07-07帶有定位當(dāng)前位置的百度地圖前端web api實(shí)例代碼
這篇文章主要介紹了帶有定位當(dāng)前位置的百度地圖前端web api實(shí)例代碼 的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06JavaScript表單驗(yàn)證實(shí)現(xiàn)過(guò)程詳解
表單校驗(yàn)是注冊(cè)環(huán)節(jié)中必不可少的操作,表單校驗(yàn)通過(guò)一定的規(guī)則來(lái)確保用戶提交數(shù)據(jù)的有效性,下面這篇文章主要給大家介紹了關(guān)于el-form表單驗(yàn)證的一些實(shí)用方法,需要的朋友可以參考下2023-01-01javascript數(shù)組遍歷的方法實(shí)例分析
這篇文章主要介紹了javascript數(shù)組遍歷的方法,結(jié)合實(shí)例形式分析了javascript數(shù)組遍歷及相關(guān)的some、every、filter、map等方法的使用技巧,需要的朋友可以參考下2016-09-09java遇到微信小程序 "支付驗(yàn)證簽名失敗" 問(wèn)題解決
這篇文章主要介紹了java遇到微信小程序 "支付驗(yàn)證簽名失敗" 問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12微信小程序事件 bindtap bindinput代碼實(shí)例
這篇文章主要介紹了微信小程序事件 bindtap bindinput代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Javascript實(shí)現(xiàn)多彩雪花從天降散落效果的方法
這篇文章主要介紹了Javascript實(shí)現(xiàn)多彩雪花從天降散落效果的方法,可實(shí)現(xiàn)雪花飄落及散開(kāi)的效果,非常炫目華麗,需要的朋友可以參考下2015-02-02