我正在尝试使用属性初始化程序将箭头函数用作类的方法。
但是在声明该方法之前,它们是不可访问的。
如果我更改了声明它们的顺序,它将起作用。

是预期的行为还是通行翻译

class SampleClass1 {
  method2 = this.method1();
  method1() {
    return "works";
  }
}

console.log((new SampleClass1()).method2); // Works

class SampleClass2 {
  method2 = this.method1();
  method1 = () => {
    return "works";
  }
}

console.log((new SampleClass2()).method2); // Error


网址后面是babel repl实例,其中包含我想演示的代码,请参考它。

https://babeljs.io/repl/#?evaluate=true&presets=es2015%2Creact%2Cstage-0%2Cstage-2&experimental=false&loose=false&spec=false&code=class%20SampleClass1%20%7B%0A%20%20method2%20%3D%20this.method1()%3B%0A%20%20method1()%20%7B%0A%20%20%20%20return%20%22works%22%3B%0A%20%20%7D%0A%7D%0A%0Aconsole.log(%22(new%20SampleClass1()).method2%22)%3B%0Aconsole.log((new%20SampleClass1()).method2)%3B%0A%0Aclass%20SampleClass2%20%7B%0A%20%20method2%20%3D%20this.method1()%3B%0A%20%20method1%20%3D%20()%20%3D%3E%20%7B%0A%20%20%20%20return%20%22works%22%3B%0A%20%20%7D%0A%7D%0A%0Aconsole.log(%22(new%20SampleClass2()).method2%22)%3B%0Aconsole.log((new%20SampleClass2()).method2)%3B

最佳答案

是的,这是预期的行为。请记住,此ESnext提案草案的语法基本上可以理解为

class SampleClass1 {
  constructor() {
    this.method2 = this.method1();
  }
  method1() {
    return "works";
  }
}

class SampleClass2 {
  constructor() {
    this.method2 = this.method1();
    this.method1 = () => {
      return "works";
    }
  }
}


很明显,您可以从构造函数中调用原型方法,但不能调用尚未创建的实例属性上的方法。

关于javascript - 在声明之前未定义属性初始化器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36383658/

10-09 23:26
查看更多