我可以在反应组件的构造函数中使用箭头函数吗?

yca*_*ars 17 javascript constructor ecmascript-6 reactjs arrow-functions

这个问题类似于使用React时最好使用胖箭头函数还是在构造函数中绑定函数?但有点不同.您可以this在构造函数中绑定函数,或者只在构造函数中应用箭头函数.请注意,我只能在项目中使用ES6语法.

1.

class Test extends React.Component{
  constructor(props) {
    super(props);

    this.doSomeThing = this.doSomeThing.bind(this);
  }

  doSomething() {}
}
Run Code Online (Sandbox Code Playgroud)

2.

class Test extends React.Component{
  constructor(props) {
    super(props);

    this.doSomeThing = () => {};
  }
}
Run Code Online (Sandbox Code Playgroud)

这两种方式的优点和缺点是什么?谢谢.

Est*_*ask 10

出于某些原因,选项1通常更优选.

class Test extends React.Component{
  constructor(props) {
    super(props);

    this.doSomeThing = this.doSomeThing.bind(this);
  }

  doSomething() {}
}
Run Code Online (Sandbox Code Playgroud)

原型方法更加清晰.子类可以覆盖或扩展doSomething

doSomething() {
  super.doSomething();
  ...
}
Run Code Online (Sandbox Code Playgroud)

当实例属性

this.doSomeThing = () => {};
Run Code Online (Sandbox Code Playgroud)

或ES.next类字段

doSomeThing = () => {}
Run Code Online (Sandbox Code Playgroud)

相反,使用调用super.doSomething()是不可能的,因为该方法没有在原型上定义.覆盖它将导致在this.doSomeThing父构造函数和子构造函数中分配属性两次.

mixin技术也可以使用原型方法:

class Foo extends Bar {...}
Foo.prototype.doSomething = Test.prototype.doSomething;
Run Code Online (Sandbox Code Playgroud)

原型方法更容易测试.在类实例化之前,它们可以被窥探,存根或模拟:

spyOn(Foo.prototype, 'doSomething').and.callThrough();
Run Code Online (Sandbox Code Playgroud)

这允许在某些情况下避免竞争条件.