在es6中,super的意思是“超級(jí)”,該關(guān)鍵字既可以作為函數(shù)使用,又可以作為對(duì)象使用:1、作為函數(shù)時(shí),代表的是父類的構(gòu)造函數(shù),語法為“constructor(){super();}”;2、作為對(duì)象時(shí),代表的是父類的原型對(duì)象。
本教程操作環(huán)境:windows10系統(tǒng)、ECMAScript 6.0版、Dell G3電腦。
es6關(guān)鍵字super是什么意思
ES6重新實(shí)現(xiàn)了類的繼承,而在繼承的過程中,super關(guān)鍵字實(shí)現(xiàn)了至關(guān)重要的作用,可以說理解不了super關(guān)鍵字,也就掌握不了類的繼承,今天我們就一起來盤盤super這個(gè)關(guān)鍵字
首先拋出一個(gè)概念: super這個(gè)關(guān)鍵字,既可以當(dāng)作函數(shù)使用,又可以當(dāng)作對(duì)象使用
第一種情況:super作為函數(shù)時(shí),代表父類的構(gòu)造函數(shù)
ES6要求,子類的構(gòu)造函數(shù),必須執(zhí)行一次super
函數(shù)
class A {}class B extends A { constructor() { super();//子類的構(gòu)造函數(shù),必須執(zhí)行一次super函數(shù),代表父類的構(gòu)造函數(shù) }}
注意:雖然super代表父類的構(gòu)造函數(shù),但此時(shí)返回的時(shí)B的實(shí)例,即super內(nèi)部的this指的是B的實(shí)例,因此super()
相當(dāng)于 A.prototype.constructor.call(this)
上述代碼中,new.target
指向當(dāng)前正在執(zhí)行的函數(shù),super()執(zhí)行的時(shí)候,它指向的是子類B的構(gòu)造函數(shù),而不是父類A的構(gòu)造函數(shù),也就是說,super()內(nèi)部的this指向B
第二種情況:super作為對(duì)象時(shí),在普通方法中,指向父類的原型對(duì)象,在靜態(tài)方法中,指向父類
class A { p() { return 2; }}class B extends A { constructor() { super();//父類的構(gòu)造函數(shù) console.log(super.p()); // 2 }}let b = new B();
上面代碼中,super
作為函數(shù)時(shí),代表父類的構(gòu)造方法,作為對(duì)象時(shí),指向父類的原型對(duì)象,即A.prototype
,所以super.p()
相當(dāng)于A.prototype.p()
這里還需要注意,由于 super指向父類的原型,所以在父類實(shí)例上的屬性或者方法,并不能通過super調(diào)用
上面代碼中,p是父類A實(shí)例的屬性,super.p
就引用不到它
【