【发布时间】:2019-07-19 16:36:27
【问题描述】:
我在我的应用程序中使用父类为其子类提供一些基本功能。大致是这样的:
class Base {
constructor(stream) {
stream.subscribe(this.onData)
}
onData(data) {
throw new Error('"onData" method must be implemented')
}
}
class Child extends Base {
onData(data) {
// do stuff...
}
}
效果很好,当我实例化 Child 时,Base 将 Child.onData 传递给 stream
唯一的问题是范围。在Child.onData 中,我大量使用通过this 关键字在child 中定义的其他方法。因此,当我将此函数作为回调传递给stream 时,一切都会中断。明显的解决方案是:
class Base {
constructor(stream) {
stream.subscribe(this.onData)
}
onData = (data) => {
throw new Error('"onData" method must be implemented')
}
}
class Child extends Base {
onData = (data) => {
// do stuff...
}
}
这确实解决了范围问题,但现在传递给stream 的函数始终是Base.onData,这会引发错误。一般来说,我可以做一些事情,比如将Child.onData 传递给Base 构造函数。这可行,但我想找到一个更优雅的解决方案,如果它存在的话
【问题讨论】:
-
我很难理解您的问题...
-
很可能会坏掉,因为你传递的时候需要绑定它。
-
@GetOffMyLawn 基本上覆盖的属性不能从父级访问,我需要它
-
这是因为子级分配了
this.onData属性之后super()构造函数运行并安装了旧的、未覆盖的值作为流处理程序。所以 a) 当你计划重写继承的方法时不要使用箭头函数 b) don't call (or otherwise use) overridable methods in the constructor. -
您应该在
Base构造函数中简单地bind方法(或使用箭头函数包装器)
标签: javascript oop inheritance babeljs