ES6中的關鍵字super該如何理解?

時間 2021-05-06 13:41:32

1樓:

class Cat

speak()

speak()

a.speak() // Tom makes a noise.

let b = new Lion('Simba', 'orange')

console.log(b) //Lion

b.speak() // Simba makes a noise. Simba roars.

console.log(obj.toString()) // My little pony[object Object] (???)

console.log(obj.__proto__.toString()) // [object Object] (!!!)

2樓:

super([arguments]);

// 呼叫父物件/父類的建構函式

super.functionOnParent([arguments]);

// 呼叫父物件/父類上的方法

簡單的來說可以將super的作用分成兩點:

在構造器中呼叫父類的建構函式.

在這個場景中, super表示的是父類的構造器, 呼叫super() 將會用父類的構造器來為子類的例項繫結屬性.

呼叫父類的成員.

在這個場景中, 你需要用"點記法"來訪問父類的成員, super表示的是父類自身.

這裡有乙個和其他語言不同, 又令人感覺莫名其妙的地方, 那就是 super 關鍵字的不一致性. 如果一律使用 super來表示父類(更符合語義), 那麼我們應該用 super.constructor() 來呼叫父類構造器, 對吧?

所以除了記住這個死規律也沒什麼辦法了, 所以說第一門物件導向語言不要學JS, 否則你的腦子裡面就會有一些很混亂的東西, 分不清super和super, this和this.

3樓:manxisuo

super是個關鍵字,而不是識別符號,當然可以在不同情況下有不同的語意。

在ES6中,super關鍵字構成兩種表示式(實際是三種形式,見12.3.5 The super Keyword) :

1. SuperProperty : super . IdentifierName

2. SuperCall : super Arguments

分別對應你問題中的兩種形式,即第一種是取屬性,第二種是作為函式呼叫。具體語意見規範。

單說你例子中的情況:

1. super.speak()

相當於:

Cat.prototype.speak.call(this)

2. super(name)

相當於:

Cat.prototype.constructor.call(this, name)

或者Cat.call(this, name)

4樓:Belleve

呼叫基類方法,隨所在位置不同而不同,挺蛋疼的其實……

你可以翻我 13 年的演講稿,不過之後 ES6 的草稿有改,所以現在未必適用

5樓:

class

Catspeak()}

class

Lion

extends

Catspeak()}

vara=}

console

.log(a

.val

())// 返回 true

es6中的super怎麼這麼多的歧義

DisLido 感受一下 classAf f1 f3 class BextendsA newB 其實可以這樣理解 在上例中把super當作A.prototype,在B中不允許通過super對A的prototype直接做改動,如果你試圖對A的prototype做改動,那麼改動將會指向this 但是可以...

如何理解C 中的關鍵字static, const, 以及 define在定義變數時的區別?

他們沒有聯絡只有區別 不同層面上的東西。define 預處理層面上的替換,不存在於語意層面static 變數的作用域控制 const 變數的訪問控制 唯讀 wuxinliulei C C 裡面的static 面向過程的static 在c和c 面向過程的設計裡,在全域性變數前加上static關鍵字則可...

如何讓es6中class的成員函式支援IIFE?

楊健 class A constructorthis.method this.methodmethodlet state 1 return statelet a new Aconsole.log a.method console.log a.method console.log a.method 初...