【问题标题】:Extending parent class methods in child class in Javascript ES6在Javascript ES6中的子类中扩展父类方法
【发布时间】:2018-02-24 22:22:15
【问题描述】:

我想在父类中扩展子类特定方法的功能。我还在习惯 ES6 中的 OOP,所以我不确定这是否可行或违反规则。

我正在寻找这样的东西:

class Parent {
  constructor(elem) {
    this.elem = elem;

    elem.addEventListener((e) => {
      this.doSomething(e);
    });
  }

  doSomething(e) {
    console.log('doing something', e);
  }
}

class Child extends Parent {
  constructor(elem) {
    // sets up this.elem, event listener, and initial definition of doSomething
    super(elem)
  }

  doSomething(e) {
    // first does console.log('doing something', e);
    console.log('doing another something', e);
  }
}

本质上,我想在父方法上附加一个特定于子的回调。有没有一种创造性的方式来做到这一点,而无需创建具有相同功能的全新类?

【问题讨论】:

  • extends 是每个类而不是每个实例。你想达到什么目标?
  • 将我的请求调整为只说“特定于孩子”,忽略我对“实例”@ideaboxer 的使用
  • 设置 this.elem 应该发生在super() 调用之后...
  • 你能举一个真实的例子吗?这可能是 xy 问题...

标签: javascript oop inheritance ecmascript-6


【解决方案1】:

您可以在方法中使用super

doSomething(e) {
  super.doSomething(e)
  console.log('doing another something', e)
}

子类和父类中的this是同一个东西,指的是实际的对象,所以如果你在父类的代码中调用一个方法,它会调用子类的实现,如果它确实是一个子类。同样适用于其他语言,例如 Python 和 Ruby。

工作代码:

class Parent {
  constructor(elem) {
    this.elem = elem
    this.elem.addEventListener('click', (e) => { this.doSomething(e) })
  }

  doSomething(e) {
    alert('doing something')
  }
}

class Child extends Parent {
  constructor(elem) {
    super(elem)
  }

  doSomething(e) {
    super.doSomething(e)
    alert('doing another something')
  }
}

let child = new Child(document.getElementById('button'))
<button id="button">Alert</button>

【讨论】:

  • super.doSomething(e) 在我的示例中由事件侦听器调用。我想使用 super 的事件侦听器来触发 child 的方法作为回调 - 或者至少在之后。这个实现似乎只是从不同的方法中调用了 super 的方法,导致我重新建立了在 child 中侦听的事件。
  • 是的,这实际上工作得很好。出于某种原因,我认为 super.doSomething(e) 会在没有父上下文的情况下被调用。
猜你喜欢
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 2018-07-08
相关资源
最近更新 更多