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 初...