考慮以下超類和子類擴展它:ES6箭頭功能觸發「‘超級’的函數或類外」錯誤
class SuperClass {
constructor(name){
this.name = name;
}
sayName =() => {
alert(this.name);
}
}
class SubClass extends SuperClass {
constructor(name){
super(name);
}
sayName =() => {
super.sayName();
document.getElementsByTagName('body')[0].innerHTML = this.name;
}
}
let B = new SubClass('Noam Chomsky');
B.sayName();
在該例子中,函數sayName
被寫爲在兩個箭頭功能類定義。當我打電話B.sayName()
我得到一個錯誤說:
'super' outside of function or class
JSFiddle demonstrating the error(檢查控制檯)
不過,如果我重新寫的類定義不使用箭頭功能,一切工作正常我沒有得到一個錯誤:
class SuperClass {
constructor(name){
this.name = name;
}
sayName() {
alert(this.name);
}
}
class SubClass extends SuperClass {
constructor(name){
super(name);
}
sayName() {
super.sayName();
document.getElementsByTagName('body')[0].innerHTML = this.name;
}
}
let B = new SubClass('Noam Chomsky');
B.sayName();
JSFiddle demonstrating that it works fine
有人可以解釋爲什麼我在這裏使用箭頭函數時出現這個錯誤嗎?
爲什麼要定義'sayName'作爲首位箭頭的功能? 'sayName =()=> {alert(this.name); }語法甚至還沒有標準(目前是第2階段) –
jsfiddle使用的Babel版本可能存在問題。正如其中一個答案所說的,調用'super.sayName()'不管用,因爲'SuperClass.prototype'上沒有'sayName'方法。 **然而**,在SubClass的'sayName'方法內引用'super'應該可以工作。畢竟,代碼是一樣的(注意,我在'SuperClass'中使'sayName'成爲一個合適的方法):https://jsfiddle.net/5y9bqwd0/ –
這裏是另一個子箭頭函數屬性的選項:https: //jsfiddle.net/zoeh5bp2/。他們的Bot是關於從構造函數中關閉'super'的。 – dhilt