【问题标题】:Javascript ES6(ES2015)/ Typescript: how to access local method inside static methodJavascript ES6(ES2015)/ Typescript:如何在静态方法中访问本地方法
【发布时间】:2016-11-11 07:19:03
【问题描述】:

我基本上想在静态“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;

【问题讨论】:

  • 你是用打字稿还是只用javascript?
  • 我认为你不能使用箭头函数作为类方法。
  • 这是不可能的;用一个真实的例子解释你为什么需要它,将使我们能够提供替代方案。
  • @KonstantinVitkovsky 其实我想这样做的原因是因为我想覆盖 react native 路由器通量右键功能,这样我就可以为 webview 调用 reload stackoverflow.com/questions/40524030/…
  • @Newbie009 好的,但是这个问题适用于任何 js/ts 应用程序 :-) 顺便说一句,我的回答对你有帮助吗,或者还有什么要解决的吗?)

标签: javascript typescript ecmascript-6


【解决方案1】:

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

您要做的是将静态方法与要从静态方法调用的对象的上下文绑定。您可以通过使用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);

注意: this 默认引用你的类,而不是类的实例(绑定后它会引用一个实例),所以如果你想从第一个调用另一个静态方法你想使用完整的类名的静态方法。

static bar () {
  this.foo();
  ABC.someOtherStaticMethod();
}

另请注意:如果您使用 Typescript,则在引用实例方法时会出错,因为默认情况下,静态方法中的 this 会引用您的类。要解决此问题,您可能需要将此类型转换为 any

static bar () {
  (<any>this).foo();
}

在这里你告诉 Typescript 编译器“假设 this 不是我们的类,而是我们不知道的东西”,只是为了消除编译时的错误。

【讨论】:

  • 您解释了您可以做什么,但您仍然必须持有实例变量才能使其工作,而 OP 没有。尽管它在技术上回答了这个问题,但如果 OP 确实找到了一种方法来获取对 this 的引用,那么您的建议将使代码流与开发人员期望的相反并使他们感到困惑,尤其是在类型转换为 @987654332 时@.
  • 我同意,这种方法是一种变通方法,它可能很难看,并且可能会使其他开发人员感到困惑,但有时您必须制作 something 才能使事情正常进行。归根结底,最重要的是让软件能够运行 :)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    相关资源
    最近更新 更多