ES5的繼承和ES6的繼承

關(guān)于js中的繼承,已經(jīng)老生常談了,本文將對js的繼承做一個大概的總結(jié).

首先我們可以看一下,es5繼承關(guān)系圖,理解繼承的實現(xiàn),然后再討論不同的繼承的實現(xiàn)方式的問題


ES5的繼承鏈

1.在js實現(xiàn)繼承靠的構(gòu)造函數(shù)的原型對象(即Prototype)

2.js中所有的對象都繼承Object

3.Object的原型對象的[[prototype]]指向null

看完上面的原型繼承圖之后,我們接下來就可以按照原型鏈去實現(xiàn)繼承了


1.組合繼承

function Super(age){

this.name = "lsh";

this.age = age;

}

Super.prototype.sayName = function (){

console.log(this.name);

}

function Sub(){

Super.call(this,99);

}

Sub.prototype = new Super;

Sub.prototype.constructor = Sub;

Sub.prototype.hello = function (){

console.log(this.age);

}

首先借用構(gòu)造函數(shù),利用的是js中函數(shù)執(zhí)行的環(huán)境問題,call和apply可以修改函數(shù)執(zhí)行的函數(shù),實際上是修改了函數(shù)內(nèi)部的this對象.其實就是在子類的構(gòu)造函數(shù)內(nèi)部調(diào)用父類的構(gòu)造函數(shù),通過call或apply修改其this對象,實現(xiàn)一種繼承的現(xiàn)象.然后再設(shè)置子類的prototype為父類的對象,完成原型的繼承

2.原型是繼承

原型繼承要求你必須有一個對象作為另一個對象的基礎(chǔ),將這個對象傳入Objec.create函數(shù)中,create函數(shù)返回一個新的對象,這個新的對象的原型就是你傳入的對象.這樣新的對象就會在原型上擁有你傳入對象的所有屬性和方法,包括其原型

function Person(){

this.name = 'lsh';

this.friends = ['name1','name2'];

}

Person.prototype.sayName = function(){

console.log(this.name);

}

var person = new Person();

var person1 = Object.create(person);

person1.friends.push('name3');

var person2 = Object.create(person);

person2.name = 'xindi';

person2.friends.push('name4');

這樣的結(jié)果其實就是相當(dāng)于創(chuàng)造了一個你傳入對象的副本.如果你傳入的對象包含有引用類型的屬性,則這個屬性會被共享.

此時原型鏈的關(guān)系就會是

superPerson.__proto__.__proto__ === Person.prototype

superPerson.__proto__.constructor === Person

其實create方法內(nèi)部的實現(xiàn)機(jī)制就是創(chuàng)造了一個臨時的構(gòu)造函數(shù),然后將臨時構(gòu)造函數(shù)的原型指向你傳入的對象,最后返回臨時構(gòu)造函數(shù)生成的對象.

function create(o){

function F(){};

F.prototype = o;

return new F();

}

所以當(dāng)你采用原型式繼承的時候,要考慮清楚這種繼承是否滿足你的需要.

3.寄生式繼承

寄生式繼承和原型式繼承關(guān)系緊密,其實就是封裝一個繼承用的函數(shù),在函數(shù)內(nèi)部調(diào)用原型式繼承,同時在函數(shù)內(nèi)部可以選擇給新的對象增加一個方法或?qū)傩?/p>

function createAnother(ori){

let clone = Object.create(ori);

clone.sayHi = function(){

}

return clone;

}

4.寄生組合式繼承

寄生組合式繼承,就是通過構(gòu)造函數(shù)來繼承屬性,通過原型鏈的混成方式來繼承原型的方法或?qū)傩?/p>

function inherit(superType,subType){

let prototype = Object.create(superType.prototype);

prototype.constructor = subType;

sub.prototype = prototype;

}

函數(shù)第一步創(chuàng)建了一個父類的原型的副本,然后讓這個對象的contructor指向子類的構(gòu)造函數(shù),最后將子類構(gòu)造函數(shù)的原型設(shè)置為這個對象.這樣就實現(xiàn)了一個繼承.

寄生組合式繼承是最理想的繼承方式,推薦使用這個方式.

ps:如何確定實例和原型的關(guān)系:

1.instance ?instanceof Super

2.Super.prototype.isPrototypeof instance?

給子類原型添加方法,無論是重寫超類的方法還是添加新的,一定要在原型被替換之后再寫,也就是在調(diào)用繼承之后再添加.

不過在ES6 ,js添加了class這個語法糖,其繼承也只需簡單的寫一個extends.

class Super {

? ? ? constructor(name){


? ? ? ? this.name = 'name';


? ? }

? ? ? sayName(){

? ? ? console.log(this.name);

? ? ? }

? ? ? }


class Sub extends Super{

constructor(name){

super(name);

?? ? this.name = 'xindi';

}

}

這個語法糖使得es6的繼承變得無比簡單,不過es6的繼承還是和es5的稍微有點區(qū)別,如下圖


es6繼承

es6的繼承相較于es5,其實就多了一個子類構(gòu)造函數(shù)和父類構(gòu)造函數(shù)的關(guān)系上,在es5中兩個構(gòu)造函數(shù)沒有任何關(guān)系,但是在es6中子類構(gòu)造函數(shù)的__proto__(即[[prototype]])指向了父類的構(gòu)造函數(shù).

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匀伏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件醉拓,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)笑跛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門付魔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人飞蹂,你說我怎么就攤上這事几苍。” “怎么了陈哑?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵妻坝,是天一觀的道長。 經(jīng)常有香客問我惊窖,道長刽宪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任界酒,我火速辦了婚禮纠屋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盾计。我一直安慰自己售担,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布署辉。 她就那樣靜靜地躺著族铆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哭尝。 梳的紋絲不亂的頭發(fā)上哥攘,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音材鹦,去河邊找鬼逝淹。 笑死,一個胖子當(dāng)著我的面吹牛桶唐,可吹牛的內(nèi)容都是我干的栅葡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼尤泽,長吁一口氣:“原來是場噩夢啊……” “哼欣簇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坯约,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤熊咽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后闹丐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體横殴,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年卿拴,在試婚紗的時候發(fā)現(xiàn)自己被綠了衫仑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梨与。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惑畴,靈堂內(nèi)的尸體忽然破棺而出蛋欣,到底是詐尸還是另有隱情航徙,我是刑警寧澤如贷,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站到踏,受9級特大地震影響杠袱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窝稿,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一楣富、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伴榔,春花似錦纹蝴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至援奢,卻和暖如春兼犯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背集漾。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工切黔, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人具篇。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓纬霞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親驱显。 傳聞我的和親對象是個殘疾皇子险领,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

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