JavaScript實現(xiàn)繼承的方法-創(chuàng)新互聯(lián)

這篇文章將為大家詳細講解有關JavaScript實現(xiàn)繼承的方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

公司主營業(yè)務:做網(wǎng)站、網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)建站是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出鳳翔免費做網(wǎng)站回饋大家。

“繼承”是面向?qū)ο缶幊汤锩娼?jīng)常提及到的概念,它的目的是實現(xiàn)代碼復用。JavaScript并沒有“類”的概念,那么,它如何實現(xiàn)繼承呢?

(ES6有關鍵字class和extend,繼承的語法與Java等面向?qū)ο笳Z言類似,但是,ES6 class,只是JavaScript原型繼承的語法糖而已)

1. 類式繼承

關鍵點:通過構(gòu)造函數(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"

特點:使用這種繼承模式,子類不僅僅會繼承父類原型上的方法/屬性,還會繼承父類自身的屬性。

這種模式的缺點是,在初始化父類對象指向給子類原型時,并不確定父類構(gòu)造函數(shù)的初始化參數(shù)(Child.prototype = new Parent("child");),而且,往往這些參數(shù)并不是子類需要的。

(2) 借用構(gòu)造函數(shù)

改造子類:

function Child(){
 Parent.apply(this, arguments);
}

特點:使用這種繼承模式,子類只會繼承父類自身的屬性。

缺點很明顯,它無法從原型鏈中繼承任何方法/屬性。

(3) 共享原型

Child.prototype = Parent.prototype;

這種方式的缺點是,子類原型和父類原型共享一個對象,那么,子類如果修改原型,必然會影響父類。

(4) 臨時構(gòu)造函數(shù)

function inherit(Child, Parent) {
 var F = function(){};
 F.prototype = Parent.prototype;
 Child.prototype = new F();
}

特點:利用一個空函數(shù)F()充當子類和父類之間的代理,既可以實現(xiàn)父類原型方法/屬性的繼承,又可以在子類原型上繼續(xù)擴展方法/屬性。

一般,我們可以利用ES5提供的新方法Object.create()來實現(xiàn)此類繼承。

Child.prototype = Object.create(Parent.prototype);

2. 通過復制屬性實現(xiàn)繼承

復制屬性分為淺拷貝深拷貝。

淺拷貝不會復制對象類型,只會簡單的將對象引用指向子類,代碼如下:

function extend(parent, child) {
 var key;
 for(key in parent) {
  if (parent.hasOwnProperty(key)){
   child[key] = parent[key];
  }
 }
 return child;
}

深拷貝會做深度復制,如果某個屬性為對象類型,那么,它會復制出該對象的屬性,再拷貝給子類。代碼如下:

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. "借用方法"模式復用父類函數(shù)

如果不想實現(xiàn)父子之間的完全繼承,僅僅期望子類實現(xiàn)父類中一個或多個方法,那么可以利用apply, call, bind來調(diào)用父類函數(shù),實現(xiàn)復用。

代碼如下:

parent.say.call(child, "hello, child!");

關于“JavaScript實現(xiàn)繼承的方法”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)建站www.muchs.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

當前題目:JavaScript實現(xiàn)繼承的方法-創(chuàng)新互聯(lián)
文章起源:http://www.muchs.cn/article38/diejpp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、企業(yè)建站、企業(yè)網(wǎng)站制作營銷型網(wǎng)站建設、微信公眾號網(wǎng)站建設

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設計公司