class的繼承(筆記)

子類通過extends關鍵字繼承父類颖对。

class Par{
    constructor(){
        this.num=21;
    }
}
class  Chil  extends Par{
    constructor(){
      //繼承父類的構造函數(shù)constructor
        super() //這里必須寫,否則下面實例會報錯吉嫩。
    }
}

var p=new Chil();
console.dir(p.num) //21

注意:子類必須在constructor方法中調用super方法价认,否則新建實例時會報錯。這是因為子類實例的構建自娩,基于父類實例用踩,只有super方法才能調用父類實例。

ES5 繼承和ES6 繼承對比
  • ES5 的繼承機制:是先創(chuàng)造子類的實例對象this忙迁,然后再將父類的方法添加到this上面(Parent.apply(this))脐彩。
  • ES6 的繼承機制:是先將父類實例對象的屬性和方法,加到this上面(所以必須先調用super方法)姊扔,然后再用子類的構造函數(shù)修改this序攘。

super關鍵字

1.可以當函數(shù)用酒唉。
super作為函數(shù)調用時,代表父類的構造函數(shù)画恰。

class A {}

class B extends A {
  constructor() {
    super();
  }
}

注意:

  • super雖然代表了父類A的構造函數(shù)证九,但是返回的是子類B的實例删豺,即super內部的this指的是B的實例,因此super()在這里相當于A.prototype.constructor.call(this)愧怜。
  • super只能用在子類的constructor中呀页。

2.可以作為對象使用。
super 作為對象使用時, 在普通的方法中拥坛,指向的是父類的原型對象蓬蝶。在靜態(tài)方法中,指向的是父類猜惋。

class A {
  constructor() {
    // 這里是實例上的屬性
    this.p = 1;
  }
  // 普通方法丸氛,放在A原型上的。
  say(){
    console.log("普通方法")
  }
  // 靜態(tài)方法著摔,能被子類繼承缓窜,但是不能被實例化對象繼承。
  static greeting(){
    console.log("靜態(tài)方法")
  }
}
// 靜態(tài)屬性
A.age=22;

class B extends A {
  constructor(){
    super();
  }
  bsay(){
    // p是實例的屬性谍咆,通過this訪問
      console.log(this.p) //1
    // 在普通方法中禾锤,super指向的是父類原型對象,即prototype摹察,
    // 所以能訪問父類原型上的方法恩掷。
    super.say() // "普通方法";
  }
  static bgreeting(){
    // 在靜態(tài)方法中,super指向的是父類供嚎,能訪問父類的靜態(tài)屬性和靜態(tài)方法黄娘。
    super.greeting(); //"靜態(tài)方法"
    console.log(super.age); //22
  }
}

let xiao = new B();
xiao.bsay();
B.bgreeting(); 

要點總結:

  • 靜態(tài)方法峭状,能被子類繼承,不能被實例對象繼承寸宏。
  • 因為普通方法中宁炫,super指向的是父類原型對象。所以子類中氮凝,通過super只能訪問到父類原型上的方法羔巢。
  • 在靜態(tài)方法中,super指向的是父類罩阵,只能訪問父類的靜態(tài)屬性和靜態(tài)方法竿秆。
  • 普通方法中,this指向的是當前類的實例對象稿壁。
  • 靜態(tài)方法中幽钢,this指向的是當前類。

類的 prototype 屬性和proto屬性

類同時有prototype屬性和__proto__屬性傅是,因此同時存在兩條繼承鏈匪燕。
例子:

class Par{
    constructor(){
        // ....
    }
    say(){
        console.log("我今年"+this.age+"歲了!")
    }
    static greeting(){
        console.log("hello")
    }
}
Par.num=101;
class  Chil  extends Par{
    constructor(){
        super()
    }
}
console.dir(Chil)
  • 子類的__proto__屬性 ,指向父類喧笔。
    Chil.__proto__ === Par
    image.png
  • 子類prototype屬性的__proto__屬性帽驯,指向父類的prototype屬性。
    Chil.prototype.__proto__ === Par.prototype

    image.png

  • 子類實例的__proto__屬性的__proto__屬性书闸,指向父類實例的__proto__屬性尼变。也就是說,子類的原型的原型浆劲,是父類的原型嫌术。
    Chil.__proto__.__proto__ === Par.__proto__

原生構造函數(shù)繼承

  • Boolean()

  • Number()

  • String()

  • Array()

  • Date()

  • Function()

  • RegExp()

  • Error()

  • Object()

  • ES5 是先新建子類的實例對象this,再將父類的屬性添加到子類上牌借,由于父類的內部屬性無法獲取度气,導致無法繼承原生的構造函數(shù)。

  • ES6 允許繼承原生構造函數(shù)定義子類走哺,因為 ES6 是先新建父類的實例對象this蚯嫌,然后再用子類的構造函數(shù)修飾this,使得父類的所有行為都可以繼承丙躏。

class MyArray extends Array {
  constructor(...args) {
    super(...args);
  }
}

var arr = new MyArray();
arr[0] = 12;
arr.length // 1

arr.length = 0;
arr[0] // undefined
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末择示,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子晒旅,更是在濱河造成了極大的恐慌栅盲,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件废恋,死亡現(xiàn)場離奇詭異谈秫,居然都是意外死亡扒寄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門拟烫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來该编,“玉大人,你說我怎么就攤上這事硕淑】慰ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵置媳,是天一觀的道長于樟。 經(jīng)常有香客問我,道長拇囊,這世上最難降的妖魔是什么迂曲? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮寥袭,結果婚禮上路捧,老公的妹妹穿的比我還像新娘。我一直安慰自己传黄,他們只是感情好鬓长,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尝江,像睡著了一般。 火紅的嫁衣襯著肌膚如雪英上。 梳的紋絲不亂的頭發(fā)上炭序,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音苍日,去河邊找鬼惭聂。 笑死,一個胖子當著我的面吹牛相恃,可吹牛的內容都是我干的辜纲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼拦耐,長吁一口氣:“原來是場噩夢啊……” “哼耕腾!你這毒婦竟也來了?” 一聲冷哼從身側響起杀糯,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扫俺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后固翰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狼纬,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡羹呵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了疗琉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冈欢。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖盈简,靈堂內的尸體忽然破棺而出凑耻,到底是詐尸還是另有隱情,我是刑警寧澤送火,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布拳话,位于F島的核電站,受9級特大地震影響种吸,放射性物質發(fā)生泄漏弃衍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一坚俗、第九天 我趴在偏房一處隱蔽的房頂上張望镜盯。 院中可真熱鬧,春花似錦猖败、人聲如沸速缆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艺糜。三九已至,卻和暖如春幢尚,著一層夾襖步出監(jiān)牢的瞬間破停,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工尉剩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留真慢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓理茎,卻偏偏與公主長得像黑界,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子皂林,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內容

  • 簡介 Class 可以通過extends關鍵字實現(xiàn)繼承朗鸠,這比 ES5 的通過修改原型鏈實現(xiàn)繼承,要清晰和方便很多础倍。...
    emmet7life閱讀 357評論 0 0
  • 簡介 Class可以通過extends關鍵字實現(xiàn)繼承童社。 上面代碼定義了一個ColorPoint類,該類通過exte...
    oWSQo閱讀 672評論 0 1
  • class的基本用法 概述 JavaScript語言的傳統(tǒng)方法是通過構造函數(shù)著隆,定義并生成新對象扰楼。下面是一個例子: ...
    呼呼哥閱讀 4,096評論 3 11
  • 基本語法 簡介 JavaScript語言中,生成實例對象的傳統(tǒng)方法是通過構造函數(shù). ES6提供更接近傳統(tǒng)語言的寫法...
    JarvanZ閱讀 881評論 0 0
  • 繼承6種套餐 參照紅皮書呀癣,JS繼承一共6種 1.原型鏈繼承 核心思想:子類的原型指向父類的一個實例 Son.pro...
    燈不梨喵閱讀 3,142評論 1 2