Javascript:在父级中看不到定义为箭头函数的重写方法
我在应用程序中使用父类为其子类提供一些基本功能。大致如下:Javascript:在父级中看不到定义为箭头函数的重写方法,javascript,oop,inheritance,babeljs,Javascript,Oop,Inheritance,Babeljs,我在应用程序中使用父类为其子类提供一些基本功能。大致如下: 类基{ 构造器(流){ stream.subscribe(this.onData) } onData(数据){ 抛出新错误('onData'方法必须实现') } } 类子扩展基{ onData(数据){ //做些事情。。。 } } 这很好,当我实例化Child时,Base将Child.onData传递到流 唯一的问题是范围。在Child.onData中,我通过this关键字大量使用了Child中定义的其他方法。因此,当我将此函数作为回
类基{
构造器(流){
stream.subscribe(this.onData)
}
onData(数据){
抛出新错误('onData'方法必须实现')
}
}
类子扩展基{
onData(数据){
//做些事情。。。
}
}
这很好,当我实例化Child
时,Base
将Child.onData
传递到流
唯一的问题是范围。在Child.onData
中,我通过this
关键字大量使用了Child中定义的其他方法。因此,当我将此函数作为回调传递给流时,一切都会中断。显而易见的解决办法是:
类基{
构造器(流){
stream.subscribe(this.onData)
}
onData=(数据)=>{
抛出新错误('onData'方法必须实现')
}
}
类子扩展基{
onData=(数据)=>{
//做些事情。。。
}
}
这确实解决了作用域的问题,但是现在传递给流的函数总是Base.onData
,这会引发错误。通常,我可以做一些事情,比如将Child.onData
传递给Base
构造函数。这是可行的,但我想找到一个更优雅的解决方案,如果它存在的话,这就是原因。如果将其转换为普通ES6类,则会发生以下情况:
class Child extends Base {
constructor(...args) {
super(...args);
this.onData = (data) => {
// do stuff...
};
}
}
现在很明显,为什么在Base
构造函数中使用属性不起作用
相反,您应该使用普通方法定义,并通过在父构造函数内绑定该方法来处理:
class Base {
constructor(stream) {
if (this.onData == Base.prototype.onData)
throw new Error('"onData" method must be overridden')
this.onData = this.onData.bind(this);
stream.subscribe(this.onData)
}
onData(data) {}
}
class Child extends Base {
onData(data) {
// do stuff...
}
}
我很难理解您的问题是什么……它很可能会崩溃,因为您传递它时需要绑定它。@GetOffMyLawn基本上重写的属性无法从父级访问,我需要它到beThat,因为子级在super()之后分配this.onData
属性
constructor运行并安装旧的未重写值作为流处理程序。因此,a)当您计划重写继承的方法时,不要使用箭头函数b)。您只需在基
构造函数中绑定该方法(或使用箭头函数包装器)