JavaScript 繼承

繼承是JS中非常內(nèi)容九孩,原因就是JS沒有地道的繼承方式哪替,我們只能通過各種方式來模擬面向?qū)ο笾械睦^承柱彻。下面介紹幾種常見的繼承方式及其不足拄查。

構(gòu)造函數(shù)繼承

function Parent1 (){
    this.name = 'parent'
}

function Child1() {
    Parent1.call(this);
    this.type = 'child1';
}

缺點(diǎn):Parent1 原型鏈上的東西并不會繼承吁津,這種方式,所以只實(shí)現(xiàn)了部分繼承堕扶,如果父類的屬性都在構(gòu)造函數(shù)中碍脏,沒問題,但是如果有一部分在原型鏈上稍算,那么就繼承不了典尾,為了解決這個不足我們就要使用原型鏈來進(jìn)行原型繼承。

原型繼承

function Parent2() {
this.name = 'Parent2';
this.res = [1, 2, 3]
}

function Child2 () {
this.type = 'Child2'
}

Child2.prototype = new Parent2()

var child2 = new Child2();
var child3 = new Child3();

child2.res.push(4);
console.log(child3.res) // 1,2,3,4

缺點(diǎn) : 這種方式缺點(diǎn)也很明顯糊探,實(shí)例的兩個對象钾埂,如果一個對象改變res的值,那么另一個對象 的res屬性也會被改變(這兩個對象共享一個原型)科平,這違背了獨(dú)立性岛心。

組合

function Parent3() {
    this.name = 'parent3';
    this.res = [1, 2, 3];
}

function Child3() {
    Parent3.call(this);
    this.type = 'child3';
}

Child3.prototype = Parent3.prototype;
var child = new Child3();

缺點(diǎn):此時child.constructor并不是Child3磨隘;而是Parent3,這是因?yàn)楫?dāng)我們想獲取child.constructor實(shí)際上是訪問Child3.prototype.constructor(也就是說constructor這個屬性是存在于原型上誉结,并不是直接在child這個對象上)驶沼,而Child3.prototype此時等于Parent3.prototype,所以最后constructor的屬性值為Parent3襟己。

組合優(yōu)化

function Parent4() {
this.name = 'parent4';
this.res = [1, 2, 3];
}

function Child4() {
 Parent4.call(this);
 this.type = 'child4';
}

Child4.prototype = Object.create(Parent4.prototype);
// Child4.prototype = Parent4.prototype;
Child4.prototype.constructor = Child4;  

在這里我們加上這句Child4.prototype = Object.create(Parent4.prototype);的目的是為了隔離子類原型和父類原型犬第,現(xiàn)在就是Child4.prototype.__proto__ === Parent4.prototype诀姚,如果我們不加,直接修正子類的構(gòu)造函數(shù)(Child4.prototype.constructor = Child4;)那么也會把父類的Parent4.prototype.constructor更改成Child4妓湘,因?yàn)榇藭rChild4.prototypeParent4.prototype指向同一地址查蓉。

注: 如果這里不支持Object.create,我們可以采用下面的plolly
function F(){} F.prototype = Parent4.prototype Child4.prototype = new F()

缺點(diǎn):貌似還沒有實(shí)現(xiàn)靜態(tài)屬性的繼承

實(shí)現(xiàn)靜態(tài)屬性的繼承

function Parent() {
  this.age = 20
}

Parent.sex = 'male';
Parent.habby = 'badminton';

function Child() {
  Parent.call(this);
  this.type = 'Child';

 if (Object.setPrototypeOf) {
   Object.setPrototypeOf(Child, Parent)
 } else if (Child.__proto__) {
   Child.__proto__ = Parent
 } else {
   for (var attr in Parent) {
     if (Parent.hasOwnProperty(attr) && !(attr in Child)) {
       Child[attr] = Parent[attr]
     }
   }
 }   
}

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

var child = new Child();
var parent = new Parent();
console.log(child)
for (var key in Child) {
  console.log(key)
}

console.log(child.constructor)
console.log(parent.constructor)
console.log(child instanceof Child)
console.log(child instanceof Parent)

看似完美了,但是還有一個問題多柑,就是如果后續(xù)父類繼續(xù)添加一些靜態(tài)的方法奶是,是不會自動同步到子的靜態(tài)方法上面去的。

最后(歡迎大家關(guān)注我)

DJL簫氏個人博客
博客GitHub地址
簡書
掘金

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竣灌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子秆麸,更是在濱河造成了極大的恐慌初嘹,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沮趣,死亡現(xiàn)場離奇詭異屯烦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門驻龟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來温眉,“玉大人,你說我怎么就攤上這事翁狐±嘁纾” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵露懒,是天一觀的道長闯冷。 經(jīng)常有香客問我,道長懈词,這世上最難降的妖魔是什么蛇耀? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮坎弯,結(jié)果婚禮上纺涤,老公的妹妹穿的比我還像新娘。我一直安慰自己抠忘,他們只是感情好洒琢,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著褐桌,像睡著了一般衰抑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荧嵌,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天呛踊,我揣著相機(jī)與錄音,去河邊找鬼啦撮。 笑死谭网,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赃春。 我是一名探鬼主播愉择,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼织中!你這毒婦竟也來了锥涕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤狭吼,失蹤者是張志新(化名)和其女友劉穎层坠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刁笙,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡破花,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年谦趣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片座每。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡前鹅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出峭梳,到底是詐尸還是另有隱情舰绘,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布延赌,位于F島的核電站除盏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挫以。R本人自食惡果不足惜者蠕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掐松。 院中可真熱鬧踱侣,春花似錦、人聲如沸大磺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杠愧。三九已至待榔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間流济,已是汗流浹背锐锣。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绳瘟,地道東北人雕憔。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像糖声,于是被迫代替她去往敵國和親斤彼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 之前的JavaScript繼承一文中已經(jīng)介紹了繼承蘸泻,但那篇只能算簡介琉苇。本篇結(jié)合原型鏈詳細(xì)介紹一下JavaScrip...
    張歆琳閱讀 2,583評論 0 8
  • 我是誰,我來自哪,我是誰的誰 想必大家一定在學(xué)習(xí)或者開發(fā)過程常常被JS獨(dú)有的原型繼承撥過不少腦弦吧,為何不迎問題而...
    俗三瘋閱讀 315評論 0 2
  • 現(xiàn)在有一個"動物"對象的構(gòu)造函數(shù),還有一個"貓"對象的構(gòu)造函數(shù)。 怎樣才能使"貓"繼承"動物"呢蟋恬? 一翁潘、 構(gòu)造函數(shù)...
    wavesnow閱讀 341評論 0 1
  • 例子 我們生成兩個構(gòu)造函數(shù),后面的例子都是讓‘’貓‘’繼承‘’動物‘’的所有屬性和方法歼争。 動物(為了更好的理解各種...
    流光號船長閱讀 318評論 0 1
  • 文/雪中萍 昨天拜马,七節(jié)“生命樹”微學(xué)院家庭教育課結(jié)束,有點(diǎn)兒過去上學(xué)放假的感覺——輕松沐绒,看看所記筆記和作業(yè)俩莽,很有...
    雪中萍閱讀 7,395評論 8 11