Javascript子类方法未重写父类方法
我试图重写父类中的一个方法,但存在一些问题 下面是我正在尝试的场景的代码片段Javascript子类方法未重写父类方法,javascript,ecmascript-6,ecmascript-5,Javascript,Ecmascript 6,Ecmascript 5,我试图重写父类中的一个方法,但存在一些问题 下面是我正在尝试的场景的代码片段 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(); 它调
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();
它调用父方法add,因为这是arrow函数,有人能解释为什么会发生这种情况吗。如果我使父函数成为一个简单的javascript方法,那么子函数就可以重写
附加详细信息:
父级
add
是一个实例属性,它掩盖了子级的类方法,它是实例原型的一部分。这有点黑客行为,但您可以在构造函数中重命名和删除class属性:
类父类{
添加=()=>{
log(“父方法”);
}
}
类子级扩展父级{
构造函数(){
超级();
this.parentAdd=this.add;
删除此项。添加;
}
添加(){
log(“子方法”);
this.parentAdd();//如果需要调用父方法
}
}
const child=new child();
child.add()代码>这是。它们限制了类的扩展和测试方式
(哪些箭头方法是)是构造函数代码的语法糖:
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
的顺序很重要。我无权访问父级,因为它是库的一部分。我不能让我的子类方法作为实例属性(箭头函数),原因是有进一步的规范为孩子编写(子的子),如果我们使用箭头函数,我们将无法调用Super。@ MoHithSARMA考虑更新所有相关细节的问题。如果无法更改父项,请指定它。如果您想在子类中调用super,也应该提到这一点。