[英]Javascript Child Class method not overriding Parent Class Method
我正在嘗試從父類重寫一個方法,但是存在一些問題。
下面是我正在嘗試的方案的代碼片段。
class Parent {
add = () => {
console.log('Parent method');
}
}
class Child extends Parent {
add () {
console.log('Child Method');
}
}
// Creating an instance
const child = new Child();
child.add();
它正在調用Parent方法add,即箭頭功能,有人可以解釋為什么會這樣。 如果我將父函數設為簡單的javascript方法,則子函數可以覆蓋。
其他詳細信息 :
這是箭頭方法不方便的幾個原因之一 。 它們限制了類的擴展和測試方式。
類字段 (箭頭方法是)是構造函數代碼的語法糖:
class Parent {
constructor() {
this.add = () => {...};
}
}
只有另一個arrow方法可以覆蓋父arrow方法,因為它們是在類構造函數中定義的,而不是在類原型上定義的:
class Child extends Parent {
add = () => {
/* no super.add here because add is not prototype method */
}
}
如果打算使用super.add
,則一種解決方法是存儲父方法:
class Child extends Parent {
superAdd = this.add;
add = () => {
this.superAdd();
}
}
注意,由於這是構造函數代碼的語法糖,因此定義superAdd
和add
的順序很重要。
父add
是一個實例屬性,它使子類的類方法(該類的實例原型的一部分)黯然失色。 這有點hacking,但是您可以在構造函數中重命名和刪除class屬性:
class Parent { add = () => { console.log('Parent method'); } } class Child extends Parent { constructor() { super(); this.parentAdd = this.add; delete this.add; } add() { console.log('Child Method'); this.parentAdd(); // if you need call the parent's method } } const child = new Child(); child.add();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.