代码之家  ›  专栏  ›  技术社区  ›  Mohit Sharma

Javascript子类方法不重写父类方法

  •  2
  • Mohit Sharma  · 技术社区  · 6 年前

    我试图重写父类中的一个方法,但存在一些问题。

    下面是我正在尝试的场景的代码片段。

    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,因为这是箭头函数,有人能解释为什么会发生这种情况。如果我让父函数成为一个简单的javascript方法,那么子函数可以重写。

    附加细节 以下内容:

    1. 我无法访问家长,因为这是图书馆的一部分。
    2. 我不能将我的子类方法作为实例属性(箭头函数) ,其原因是 为child(child of child)编写的规范,如果我们使用箭头 函数我们将无法调用super。
    3. 无法重命名子函数名。
    2 回复  |  直到 6 年前
        1
  •  2
  •   Estus Flask    6 年前

    这是 one of few reasons why arrow methods aren't convenient 是的。它们限制了类的扩展和测试方式。

    Class fields (哪些箭头方法是)是构造函数代码的语法糖:

    class Parent {
      constructor() {
        this.add = () => {...};
      }
    }
    

    只有另一个箭头方法可以重写父箭头方法,因为它们是在类构造函数中定义的,而不是在类原型中定义的:

    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 都是明确的事情。

        2
  •  1
  •   Ori Drori    6 年前

    父母 add 是一个实例属性,它使作为实例原型的子类方法黯然失色。这有点老生常谈,但您可以在构造函数中重命名和删除类属性:

    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();