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方法,那么子函数就可以重写

附加详细信息


  • 我无法访问Parent,因为它是库的一部分
  • 我无法将我的子类方法作为实例属性(箭头函数) ,原因是 为孩子(孩子的孩子)编写的规范,以及我们是否使用箭头 我们将无法调用超级函数
  • 无法重命名子函数名

  • 父级
    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,也应该提到这一点。