es5繼承
構(gòu)造函數(shù)册着、原型和實(shí)例的關(guān)系:每一個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象指蚜,每一個(gè)原型對(duì)象都有一個(gè)指向構(gòu)造函數(shù)的指針涨椒,而每一個(gè)實(shí)例都包含一個(gè)指向原型對(duì)象的內(nèi)部指針。
1.原型鏈實(shí)現(xiàn)的繼承
2.借用構(gòu)造函數(shù)
3.組合繼承
4.原型式繼承
5.寄生式繼承
6.寄生組合式繼承
以上的繼承方法看紅寶書
es6繼承
class繼承免猾,class之間使用extends關(guān)鍵字
子類必須要再constructor方法中調(diào)用super方法猎提,否則新建實(shí)例會(huì)報(bào)錯(cuò)锨苏,這是因?yàn)樽宇悰]有自己的this對(duì)象,而是繼承父類的this對(duì)象伞租,然后對(duì)其進(jìn)行加工葵诈,如果不調(diào)用super方法作喘,子類就得不到this對(duì)象晕城。
prototype 和 __proto__
一個(gè)繼承語句同時(shí)存在于兩條繼承鏈:一條繼承屬性,一條實(shí)現(xiàn)方法的繼承
1 class A extends B{}
2 A.__proto__ === B;//繼承屬性
3 A.prototype.__proto__ == B.prototype;//繼承方法
區(qū)別:ES5的繼承實(shí)質(zhì)上是先創(chuàng)建子類的實(shí)例對(duì)象暇矫,然后再將父類的方法添加到this上(Parent.apply(this)).
ES6的繼承機(jī)制完全不同李根,實(shí)質(zhì)上是先創(chuàng)建父類的實(shí)例對(duì)象this(所以必須先調(diào)用父類的super()方法)几睛,然后再用子類的構(gòu)造函數(shù)修改this。
ES5的繼承時(shí)通過原型或構(gòu)造函數(shù)機(jī)制來實(shí)現(xiàn)夯接。
ES6通過class關(guān)鍵字定義類纷妆,里面有構(gòu)造方法,類之間通過extends關(guān)鍵字實(shí)現(xiàn)繼承掩幢。子類必須在constructor方法中調(diào)用super方法,否則新建實(shí)例報(bào)錯(cuò)芯丧。因?yàn)樽宇悰]有自己的this對(duì)象世曾,而是繼承了父類的this對(duì)象,然后對(duì)其進(jìn)行加工骗露。如果不調(diào)用super方法椒袍,子類得不到this對(duì)象藻茂。
注意super關(guān)鍵字指代父類的實(shí)例辨赐,即父類的this對(duì)象掀序。
注意:在子類構(gòu)造函數(shù)中惭婿,調(diào)用super后,才可使用this關(guān)鍵字换吧,否則報(bào)錯(cuò)沾瓦。