成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript 繼承的那些事

singerye / 3438人閱讀

摘要:實(shí)際上也就是在原型鏈繼承的代碼中添加在子類的構(gòu)造函數(shù)中調(diào)用父類構(gòu)造函數(shù)。寄生組合式繼承在指定子類的原型的時(shí)候不必調(diào)用父類的構(gòu)造函數(shù),而是直接使用創(chuàng)建父類原型的副本。

原本地址:http://www.ahonn.me/2017/01/2...

眾所周知,JavaScript 的繼承是實(shí)現(xiàn)繼承,而沒(méi)有 Java 中的接口繼承。這是因?yàn)?JavaScript 中函數(shù)沒(méi)有簽名,而實(shí)現(xiàn)繼承依靠的是原型鏈來(lái)實(shí)現(xiàn)的。

原型鏈繼承

JavaScript 中通過(guò)修改對(duì)象原型指向的對(duì)象來(lái)實(shí)現(xiàn)繼承,即是將一個(gè)對(duì)象的原型指向要繼承的對(duì)象實(shí)例,從而實(shí)現(xiàn)繼承對(duì)象的屬性及方法。

function SuperType() {
  this.type = "super";
}

SuperType.prototype.getType() {
  return this.type;
}

function SubType() {
  this.type = "sub";
}

SubType.prototype = new SuperType();

var sub = new SubType();
console.log(sub.getType()); // "sub"
原型鏈繼承的不足

實(shí)際上,上面的代碼還缺少一句代碼,我們將 SubType 的原型指向了 SuperType 的實(shí)例,即SubType.prototype.constructor 會(huì)返回 SuperType 而不是 SubType,使用 instanceof 操作符返回的將是 SuperType。所以需要將 SubType.prototype.constructor 重新指向 SubType

// ...
SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
// ... 

但即使是這樣,原型鏈繼承依然有兩點(diǎn)問(wèn)題:原型中的實(shí)例引用類型屬性會(huì)在所有對(duì)象實(shí)例中共享,無(wú)法想 Java 的繼承一樣向父類的構(gòu)造函數(shù)中傳遞參數(shù)。

其他繼承方式

由于原型鏈繼承存在一些不足,為了解決這些不足,JavaScript 中還有其他的幾種繼承的方式。

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

因?yàn)樵玩湡o(wú)法傳遞參數(shù)到父類的構(gòu)造函數(shù)中,因此出現(xiàn)了這種叫做借用構(gòu)造函數(shù)的技術(shù)。顧名思義,即是借用父類的構(gòu)造函數(shù)在子類中進(jìn)行調(diào)用。

function SuperType() {
  // ...
}

function SubType() {
  SuperType.call(this); // <- 執(zhí)行父類構(gòu)造函數(shù)
  // ...
}

借用構(gòu)造函數(shù)雖然解決了構(gòu)造函數(shù)傳參的問(wèn)題,但是當(dāng)父類擁有方法時(shí)每個(gè)子類的實(shí)例都會(huì)擁有獨(dú)立的方法,這個(gè)問(wèn)題與多帶帶使用構(gòu)造函數(shù)模式定義類型的時(shí)候相同。

組合繼承

類比使用構(gòu)造函數(shù)模式定義類型時(shí)的解決方法(組合構(gòu)造函數(shù)模式與原型模式),繼承時(shí)的解決方法也類似。即組合原型鏈繼承和借用構(gòu)造函數(shù),屬性由借用構(gòu)造函數(shù)的方式繼承,方法由原型鏈繼承。

實(shí)際上也就是在原型鏈繼承的代碼中添加在子類的構(gòu)造函數(shù)中調(diào)用父類構(gòu)造函數(shù)。

function SuperType() {
  this.type = "super";
}

SuperType.prototype.getType() {
  return this.type;
}

function SubType() {
  SuperType.call(this);
  this.type = "sub";
}

SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
寄生組合式繼承

組合繼承是常用的繼承方式,但是同樣的也是有不足之處:調(diào)用了兩次父類的構(gòu)造函數(shù),一次在子類構(gòu)造函數(shù)中調(diào)用父類構(gòu)造函數(shù),一次在實(shí)例父類對(duì)象賦值給子類的原型。

寄生組合式繼承在指定子類的原型的時(shí)候不必調(diào)用父類的構(gòu)造函數(shù),而是直接使用 Object.create() 創(chuàng)建父類原型的副本。

function SuperType() {
  // ...
}

function SubType() {
  SuperType.call(this);
  // ...
}

SubType.prototype = Object.create(SuperType.prototype); // 直接使用父類原型創(chuàng)建副本
SubType.prototype.constructor = SubType;
ES6 中的繼承

ES6 引入了 class 關(guān)鍵子,可以像其他語(yǔ)言中一樣使用 extends 關(guān)鍵字來(lái)繼承。雖然能夠使用 extends 實(shí)現(xiàn)繼承,但實(shí)際上內(nèi)部還是基于原型。

class SubType extends SuperType {
  constructor() {
    super();
    // ...
  }

  // ...
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/81364.html

相關(guān)文章

  • JavaScript面向?qū)ο?em>那些

    摘要:委托上面的代碼結(jié)合了構(gòu)造函數(shù)和原型兩種方式去創(chuàng)建對(duì)象,首先聊聊構(gòu)造函數(shù)構(gòu)造函數(shù)構(gòu)造函數(shù)本質(zhì)上還是函數(shù),只不過(guò)為了區(qū)分將其首字母大寫(xiě)了而已。注意注釋掉的代碼是自動(dòng)執(zhí)行的,但這并不是構(gòu)造函數(shù)獨(dú)有的,每個(gè)函數(shù)在聲明時(shí)都會(huì)自動(dòng)生成。 首先看看下面兩個(gè)1+1=2的問(wèn)題: 問(wèn)題一:為什么改變length的值,數(shù)組的內(nèi)容會(huì)變化? var arr = [1]; arr.length = 3; aler...

    王偉廷 評(píng)論0 收藏0
  • 繼承那些

    摘要:借用構(gòu)造函數(shù)繼承針對(duì)上面的繼承方法的缺點(diǎn),開(kāi)發(fā)人員使用一種叫做借用構(gòu)造函數(shù)的技術(shù),也就是我們平時(shí)說(shuō)的跟繼承。 繼承是 OO 語(yǔ)言中一個(gè)最為津津樂(lè)道的概念,許多 OO 語(yǔ)言都支持兩種繼承方式:接口繼承和實(shí)現(xiàn)繼承。接口繼承只繼承方法簽名,而實(shí)現(xiàn)繼承則繼承實(shí)際的方法。由于函數(shù)沒(méi)有簽名,在 ECMAScript 中無(wú)法實(shí)現(xiàn)接口繼承。ECMAScript 只支持實(shí)現(xiàn)繼承而且實(shí)現(xiàn)繼承主要是依靠原型...

    CoyPan 評(píng)論0 收藏0
  • 【面試】Java基礎(chǔ)那些-Two

    摘要:前言面試中對(duì)于技術(shù)職位,一般分筆試與面談,如果面試官的一些小問(wèn)題你可以立馬找到對(duì)應(yīng)的知識(shí)點(diǎn)擴(kuò)展開(kāi)來(lái),那么這就是你的優(yōu)勢(shì),本系列將講述一些面試中的事,不會(huì)很詳細(xì),但是應(yīng)該比較全面吧。 前言 面試中對(duì)于技術(shù)職位,一般分筆試與面談,如果面試官的一些小問(wèn)題你可以立馬找到對(duì)應(yīng)的知識(shí)點(diǎn)擴(kuò)展開(kāi)來(lái),那么這就是你的優(yōu)勢(shì),本系列將講述一些java面試中的事,不會(huì)很詳細(xì),但是應(yīng)該比較全面吧。 主要內(nèi)容 pa...

    you_De 評(píng)論0 收藏0
  • 2018 淺談前端面試那些

    摘要:聲明的變量不得改變值,這意味著,一旦聲明變量,就必須立即初始化,不能留到以后賦值。 雖然今年沒(méi)有換工作的打算 但為了跟上時(shí)代的腳步 還是忍不住整理了一份最新前端知識(shí)點(diǎn) 知識(shí)點(diǎn)匯總 1.HTML HTML5新特性,語(yǔ)義化瀏覽器的標(biāo)準(zhǔn)模式和怪異模式xhtml和html的區(qū)別使用data-的好處meta標(biāo)簽canvasHTML廢棄的標(biāo)簽IE6 bug,和一些定位寫(xiě)法css js放置位置和原因...

    LiuRhoRamen 評(píng)論0 收藏0
  • 2018 淺談前端面試那些

    摘要:聲明的變量不得改變值,這意味著,一旦聲明變量,就必須立即初始化,不能留到以后賦值。 雖然今年沒(méi)有換工作的打算 但為了跟上時(shí)代的腳步 還是忍不住整理了一份最新前端知識(shí)點(diǎn) 知識(shí)點(diǎn)匯總 1.HTML HTML5新特性,語(yǔ)義化瀏覽器的標(biāo)準(zhǔn)模式和怪異模式xhtml和html的區(qū)別使用data-的好處meta標(biāo)簽canvasHTML廢棄的標(biāo)簽IE6 bug,和一些定位寫(xiě)法css js放置位置和原因...

    stormgens 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<