【问题标题】:How to override class arrow function method如何覆盖类箭头函数方法
【发布时间】:2019-08-04 20:26:45
【问题描述】:

我知道这很简单,但我似乎找不到我的问题的答案。

许多引用表明,如果您具有相同的函数名,则在调用(覆盖)函数时只会调用函数的最后一个实例。

如果函数是箭头函数,我似乎无法做到这一点。

正常功能行为:

class A {
  constructor() {
    this.something();
  }

  something() {
    console.log('I am A');
  }
}

class B extends A {
  something() {
    console.log('I am B');
  }
}

let b = new B();

这确实覆盖了class A 中的something() 函数,但如果它是箭头函数格式,我似乎无法覆盖函数something()

class A {
  constructor() {
    this.something();
  }

  something = () => {
    console.log('I am A');
  }
}

class B extends A {
  something = () => {
    console.log('I am B');
  }
}

let b = new B();

为什么两者的输出不一样?如何正确覆盖父类中的箭头函数?

【问题讨论】:

  • 与箭头函数无关。使用something = function() { ... } 会得到相同的结果。
  • 区别在于赋值与声明。
  • 为什么要在这样的类中定义箭头函数?还是仅仅因为
  • @chiliNUT 这个 npm 包有一个错误,声明了这样的函数。我想扩展到该包,然后覆盖导致错误的函数,因为我不想直接编辑包。
  • 箭头函数一般不应该用作类方法,因为它们不会从对象中得到this

标签: javascript ecmascript-6 arrow-functions


【解决方案1】:
class A {
  constructor() {
    this.something();
  }

  something = () => {
    console.log('I am A');
  }
}

class B extends A {
constructor() {
    super();
    this.something();
  }
  something = () => {
    console.log('I am B');
  }
}

let b = new B();

这对我有用。发生的事情是您在 A 类内部调用 this.something(),因此它将在 A 类中使用它自己的方法。如果您在 B 类中调用它,它将使用它自己的构造函数来覆盖 A 类构造函数。您也可以使用super.something();调用B类中的A类

【讨论】:

  • 看构造函数。它正在调用该函数。现在,根据该代码如何设置。你应该得到I am A 然后I am B
  • 有没有办法只调用class B中的新函数?就像上面的例子一样(普通功能)
  • 是.....删除在class A构造函数中调用的方法。这就是代码的执行方式。从让b = new B();类B创建->扩展A类->A类初始化并执行constructor()函数->B类初始化->覆盖A类方法->然后执行constructor()函数
  • 如果我问的是不可能的问题,请告诉我。我正在使用这个 npm 包,它的一个方法(即 A 类)有错误。我正在做的是我创建了 B 类来覆盖包中有错误的方法(A 类)。所以这意味着我不能编辑(A类),因为它是一个外部包。
  • 没错。您可以覆盖您已经在执行的函数,但是,在 class A 本身初始化之前,您不能覆盖该函数。所以这是class A里面的一个函数,在初始化class A的时候需要修改,然后就不行了。但是,如果你只需要在 class B 初始化之后调用这个方法,那么它就可以正常工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多