Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:在父级中看不到定义为箭头函数的重写方法_Javascript_Oop_Inheritance_Babeljs - Fatal编程技术网

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)。您只需在
构造函数中绑定该方法(或使用箭头函数包装器)