2020-09-24(js的繼承方式)

前言

兩天沒寫了踩验,靠,怎么這么懶商玫,廢話不多說箕憾,來了來了。

繼承

子類能夠享有父類所擁有的屬性和方法拳昌,在創(chuàng)建類似實(shí)例的時候非常有用袭异。

原型鏈繼承

不知道大家有沒有搞清楚構(gòu)造函數(shù)、實(shí)例對象炬藤、原型對象之間的關(guān)系御铃,其實(shí)構(gòu)造函數(shù)也是一個對象,js一切皆對象嘛沈矿,function也是通過new Function()來創(chuàng)建的上真,而且
Function.prototype.__proto__ === Object.prototype
我想說的是:每個實(shí)例對象都是通過__proto__指針來與其構(gòu)造函數(shù)的原型對象進(jìn)行關(guān)聯(lián)的羹膳,訪問屬性時就是按照這條原型鏈睡互。

第一種繼承:簡單的獲取到父類的屬性和方法

function Parent(name) {
    this.name = name || 'parentName';
}
Parent.prototype.sayName = function () {
    console.log(this.name);
}

function Son(age) {
    this.age = age;
}
Son.prototype = new Parent();
const son1 = new Son(18);

  • 原理:
    instance.__proto__ == constructor.prototype;上面說的關(guān)系鏈
  • 缺點(diǎn):
    • 所有實(shí)例共享父類的屬性和方法,一旦子類修改自身prototype的 屬性陵像,其他子類也會受到影響
    • 只能繼承一個父類
    • 子類在創(chuàng)建實(shí)例的時候無法向父類傳參
    • 子類想要添加自己的原型方法和屬性必須在繼承之前操作

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

子類在創(chuàng)建實(shí)例時可以傳遞參數(shù)給父類

function Parent(name) {
    this.name = name || 'parentName';
}
Parent.prototype.sayName = function () {
    console.log(this.name);
}

function Son(name, age) {
    Parent.call(this, name);
    this.age = age;
}
son1 = new Son("carter", 18);
  • 原理:
    call方法執(zhí)行父類的方法就珠,添加父類本身屬性給子類
  • 缺點(diǎn):
    • 每個子類實(shí)例都需要調(diào)用父類構(gòu)造函數(shù)
    • 無法繼承父類的原型中的屬性和方法
    • 并不屬于父類的實(shí)例,只屬于子類

原型加借用構(gòu)造函數(shù)繼承

前面兩種方法的綜合醒颖,借助原型鏈繼承父類的原型屬性和方法妻怎,借用構(gòu)造函數(shù)(可以傳參),繼承父類的屬性和方法图贸,不存在共享屬性的問題蹂季。

function Parent(name) {
    this.name = name || 'parentName';
}
Parent.prototype.sayName = function () {
    console.log(this.name);
}

function Son(name, age) {
    Parent.call(this, name);
    this.age = age;
}
Son.prototype = new Parent();
son1 = new Son("carter", 18);



缺點(diǎn):

  • 需要調(diào)用兩次構(gòu)造函數(shù)
  • 需要重寫子類原型的constructor屬性

組合式繼承

遇上述方法不同的是,在繼承原型屬性時疏日,直接將子類原型對象指向父類的原型對象偿洁,這樣就不需要調(diào)用兩次構(gòu)造函數(shù)了。

function Parent(name) {
    this.name = name || 'parentName';
}
Parent.prototype.sayName = function () {
    console.log(this.name);
}

function Son(name, age) {
    Parent.call(this, name);
    this.age = age;
}
Son.prototype = Parent.prototype;
son1 = new Son("carter", 18);

缺點(diǎn):

  • 子類實(shí)例的constructor屬性指向不對

寄生式組合繼承

與組合式繼承不同的是沟优,在繼承原型屬性時涕滋,完全復(fù)制一個父類的原型對象指向子類原型。重寫constructor挠阁。

function Parent(name) {
    this.name = name || 'parentName';
}
Parent.prototype.sayName = function () {
    console.log(this.name);
}

function Son(name, age) {
    Parent.call(this, name);
    this.age = age;
}
Son.prototype = Object.create(Parent.prototype);
Son.prototype.constructor = Son;
// Object.create原理:
// Object.create = function (protoObj) {
//  function F() {};
//  F.prototype = protoObj;
//  return new F();
// }
son1 = new Son("carter", 18);

ES6的class繼承

class Parent {
    constructor(name) {
        this.name = name;
    }
    sayName() {
        console.log(this.name);
    }
}

class Son extends Parent {
    constructor(name, age) {
        super(name);
        this.age = age;
    }
}
son1 = new Son("carter", 18);

總結(jié)

ES5 的繼承宾肺,實(shí)質(zhì)是先創(chuàng)造子類的實(shí)例對象this溯饵,然后再將父類的方法添加到this上面(Parent.apply(this))。ES6 的繼承機(jī)制完全不同锨用,實(shí)質(zhì)是先將父類實(shí)例對象的屬性和方法丰刊,加到this上面(所以必須先調(diào)用super方法),然后再用子類的構(gòu)造函數(shù)修改this增拥。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末啄巧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子掌栅,更是在濱河造成了極大的恐慌秩仆,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猾封,死亡現(xiàn)場離奇詭異澄耍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)晌缘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門齐莲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人枚钓,你說我怎么就攤上這事铅搓。” “怎么了搀捷?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長多望。 經(jīng)常有香客問我嫩舟,道長,這世上最難降的妖魔是什么怀偷? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任家厌,我火速辦了婚禮,結(jié)果婚禮上椎工,老公的妹妹穿的比我還像新娘饭于。我一直安慰自己,他們只是感情好维蒙,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布掰吕。 她就那樣靜靜地躺著,像睡著了一般颅痊。 火紅的嫁衣襯著肌膚如雪殖熟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天斑响,我揣著相機(jī)與錄音菱属,去河邊找鬼钳榨。 笑死,一個胖子當(dāng)著我的面吹牛纽门,可吹牛的內(nèi)容都是我干的薛耻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼赏陵,長吁一口氣:“原來是場噩夢啊……” “哼昭卓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瘟滨,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤候醒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后杂瘸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倒淫,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年败玉,在試婚紗的時候發(fā)現(xiàn)自己被綠了敌土。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡运翼,死狀恐怖返干,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情血淌,我是刑警寧澤矩欠,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站悠夯,受9級特大地震影響癌淮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沦补,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一乳蓄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夕膀,春花似錦虚倒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至庞瘸,卻和暖如春捧弃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工违霞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嘴办,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓买鸽,卻偏偏與公主長得像涧郊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子眼五,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359