[英]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.