Javascript ES6(ES2015)/Typescript:如何在静态方法中访问本地方法

Javascript ES6(ES2015)/Typescript:如何在静态方法中访问本地方法,javascript,typescript,ecmascript-6,Javascript,Typescript,Ecmascript 6,我基本上希望访问静态“bar”方法中的“foo2”方法,但到目前为止,我只能访问“foo1”和“foo3”方法。有人能教我如何访问非静态foo2方法吗 let foo1 = () => { alert('foo1’); }; class ABC extends Component { static bar() { foo1(); //can work foo2; //not work with error "Can't find variabl

我基本上希望访问静态“bar”方法中的“foo2”方法,但到目前为止,我只能访问“foo1”和“foo3”方法。有人能教我如何访问非静态foo2方法吗

let foo1 = () => {
    alert('foo1’);
  };

class ABC extends Component {

  static bar() {
      foo1(); //can work

      foo2; //not work with error "Can't find variable foo2"

      foo2(); //not work with error "Can't find variable foo2"

      this.foo2(); //not work with error "this.foo2 is not a function"

      this.foo2; //no error but no alert, basically nothing happen

      ABC.foo3() //can work
  }

  foo2 = () => {
      alert('foo2');
  };

  static foo3 = () => {
      alert('foo3');
  };

}

module.exports = ABC;

警告:不需要从静态方法访问实例方法,这可能会混淆其他开发人员。尽量避免使用它。如果您确实使用了它,请确保您的代码得到了很好的注释,并解释了它是如何工作的。

您要做的是将静态方法与要从静态方法调用的对象的上下文绑定。您可以使用
call
方法调用它:

class ABC extends Component {
    static bar () {
      this.foo();
    }
    foo () {
      // function body
    }
}

let instance = new ABC();
ABC.bar.call(instance);
或者使用
bind
如果您想传递回调等函数,可以说是预绑定它:

let instance = new ABC();
setTimeout(ABC.bar.bind(instance), 1000);
注意:
默认情况下,此
引用的是您的类,而不是该类的实例(绑定后它将引用一个实例),因此如果要从第一个静态方法调用另一个静态方法,则需要使用完整的类名

static bar () {
  this.foo();
  ABC.someOtherStaticMethod();
}
另请注意:如果使用Typescript,则在引用实例方法时会出现错误,因为默认情况下,静态方法中的
会引用您的类。要解决此问题,您可能需要将此类型强制转换为
any

static bar () {
  (<any>this).foo();
}
静态条(){
(这个);
}

在这里,您可以告诉Typescript编译器类似于“假定
这个
不是我们的类,而是我们不知道的东西”,以消除编译时的错误。

您永远无法从静态方法(在任何语言中)访问实例方法。只有一个静态方法,但是有多个实例,它怎么知道使用哪个实例(
this
)呢?

你使用的是typescript还是javascript?我认为你不能使用arrow函数作为类方法。这是不可能的;通过一个真实的例子解释您为什么需要它,这将使我们能够提供其他选择。@KonstantinVitkovsky实际上我之所以要这样做是因为我想覆盖react native router flux right button函数,这样我就可以为webview@Newbie009 ok调用reload,但是这个问题适用于任何js/ts应用程序:-)顺便问一句,我的答案对你有帮助吗,或者还有什么需要解决的吗?)你解释了你可以做什么,但你仍然需要掌握实例变量才能使其工作,而OP没有。虽然它从技术上回答了这个问题,但如果OP真的找到了一种方法来获取对
这个
的引用,您的建议会使代码流与开发人员期望的相反,并使他们感到困惑,特别是对
任何
的类型转换。我同意,这种方法是一种权宜之计,它可能很难看,可能会让其他开发人员感到困惑,但有时您必须做出一些事情来让事情顺利进行。归根结底,最重要的是让软件工作起来:)