您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)JavaScript實(shí)現(xiàn)繼承的方法,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
“繼承”是面向?qū)ο缶幊汤锩娼?jīng)常提及到的概念,它的目的是實(shí)現(xiàn)代碼復(fù)用。JavaScript并沒有“類”的概念,那么,它如何實(shí)現(xiàn)繼承呢?
(ES6有關(guān)鍵字class和extend,繼承的語法與Java等面向?qū)ο笳Z言類似,但是,ES6 class,只是JavaScript原型繼承的語法糖而已)
1. 類式繼承
關(guān)鍵點(diǎn):通過構(gòu)造函數(shù)實(shí)現(xiàn)繼承。
父類:
function Parent(name) { this.name = name || "parent"; } Parent.prototype.say = function() { return this.name; }
子類:
function Child() {}
(1) 父類對象繼承
Child.prototype = new Parent("child"); var child = new Child(); child.say(); // "child"
特點(diǎn):使用這種繼承模式,子類不僅僅會繼承父類原型上的方法/屬性,還會繼承父類自身的屬性。
這種模式的缺點(diǎn)是,在初始化父類對象指向給子類原型時(shí),并不確定父類構(gòu)造函數(shù)的初始化參數(shù)(Child.prototype = new Parent("child");),而且,往往這些參數(shù)并不是子類需要的。
(2) 借用構(gòu)造函數(shù)
改造子類:
function Child(){ Parent.apply(this, arguments); }
特點(diǎn):使用這種繼承模式,子類只會繼承父類自身的屬性。
缺點(diǎn)很明顯,它無法從原型鏈中繼承任何方法/屬性。
(3) 共享原型
Child.prototype = Parent.prototype;
這種方式的缺點(diǎn)是,子類原型和父類原型共享一個對象,那么,子類如果修改原型,必然會影響父類。
(4) 臨時(shí)構(gòu)造函數(shù)
function inherit(Child, Parent) { var F = function(){}; F.prototype = Parent.prototype; Child.prototype = new F(); }
特點(diǎn):利用一個空函數(shù)F()充當(dāng)子類和父類之間的代理,既可以實(shí)現(xiàn)父類原型方法/屬性的繼承,又可以在子類原型上繼續(xù)擴(kuò)展方法/屬性。
一般,我們可以利用ES5提供的新方法Object.create()
來實(shí)現(xiàn)此類繼承。
Child.prototype = Object.create(Parent.prototype);
2. 通過復(fù)制屬性實(shí)現(xiàn)繼承
復(fù)制屬性分為淺拷貝和深拷貝。
淺拷貝不會復(fù)制對象類型,只會簡單的將對象引用指向子類,代碼如下:
function extend(parent, child) { var key; for(key in parent) { if (parent.hasOwnProperty(key)){ child[key] = parent[key]; } } return child; }
深拷貝會做深度復(fù)制,如果某個屬性為對象類型,那么,它會復(fù)制出該對象的屬性,再拷貝給子類。代碼如下:
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)父類中一個或多個方法,那么可以利用apply, call, bind
來調(diào)用父類函數(shù),實(shí)現(xiàn)復(fù)用。
代碼如下:
parent.say.call(child, "hello, child!");
關(guān)于“JavaScript實(shí)現(xiàn)繼承的方法”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。