【问题标题】:ES6 Javascript: Calling static methods from classes with arrow functionsES6 Javascript:从带有箭头函数的类中调用静态方法
【发布时间】:2019-02-15 13:38:45
【问题描述】:

虽然这按预期工作

class ClassWithStaticMethod {

  static staticMethod() {
    return ('staticMethod');
  };

  static staticMethod2() {
    const yee = this.staticMethod();
    return 'staticMethod2 '+yee;
  };

}

console.log(ClassWithStaticMethod.staticMethod2());
//staticMethod2 staticMethod

这是,

i) 可以使用类名访问 staticMethod(),并且

ii) 此方法可以通过使用“this”调用同一类中的另一个静态方法,

这行不通

class ClassWithStaticMethod {

  static staticMethod = () => {
    return ('staticMethod');
  };

  static staticMethod2 = () => {
    const yee = this.staticMethod;
    return 'staticMethod2 '+yee;
  };

}

console.log(ClassWithStaticMethod.staticMethod2());
//staticMethod2 undefined

从某种意义上说,我仍然可以访问 staticMethod() 方法,但我无法访问第一个方法中的另一个方法。我不确定,如果我使用

    const yee = this.staticMethod();

我收到一个错误

错误类型错误:_this.staticMethod 不是函数

【问题讨论】:

  • 这是箭头函数的一个问题:它们具有this 的通用范围。 (这就是为什么我们必须使用function() 如果你想要一个更好的调用堆栈)。在第二种方法中,this 指的是调用上下文:window
  • @weirdpanda - 这不是箭头函数的问题。这就是它们的设计方式和目的!如果您想要this 的常规方法调用行为,请使用常规方法调用,而不是箭头调用。
  • @jfriend00,很抱歉,我的语言有点不对劲。

标签: javascript ecmascript-6 es6-class arrow-functions


【解决方案1】:

箭头函数从外部作用域继承它们的this,而不是它们的this,这取决于它们的调用上下文。由于staticMethod2 尝试访问this.staticMethod,这仅在this 引用ClassWithStaticMethod 时才有效——也就是说,如果staticMethod2标准函数,而不是箭头函数。

您还需要调用 this.staticMethod()。 (const yee = this.staticMethod; 将导致 staticMethod 被强制转换为字符串,而不是被调用)

更改这两个问题,它可以按预期工作:

class ClassWithStaticMethod {

  static staticMethod = () => {
    return ('staticMethod');
  };

  static staticMethod2 = function() {
    const yee = this.staticMethod();
    return 'staticMethod2 '+yee;
  };

}

console.log(ClassWithStaticMethod.staticMethod2());

【讨论】:

  • 该死,你打败了我。
  • 感谢两位。所以真正的答案(一旦你理解了我的意思)是没有方法可以在使用箭头函数时“取消绑定”This,是吗?
  • @Gerard 没错,当您使用箭头函数时,this 将始终取决于 this 所在块的词法位置,而其他任何事情都不会取决于如何你调用它。
  • @Gerard - 是的,当您不希望 this 像箭头函数一样工作时,不要使用箭头函数。这就是它们的设计方式——这是它们生活的主要目的。如果您想要this 的常规行为,请使用常规函数调用。或者将.bind().call() 与常规函数一起使用来覆盖this 对特定函数调用的工作方式。为工作使用适当的工具。这不是箭头函数的问题。这就是它们的设计方式,您显然试图将它们用于错误的目的。
  • @jfriend00 是的,明白了:)
【解决方案2】:

当涉及到一般用途时,这是箭头函数的一个怪癖:它们具有this 的通用范围。 (这就是为什么我们必须使用function() 如果你想要一个更好的调用堆栈)。在第二种方法中,this 指的是调用上下文:window

正如下面评论中提到的,为方便起见,请勿使用简写语法;我们有这么多选择是有原因的。

要修复它,您可以使用function() 定义第二个函数;或 () 在对象情况下。

但是,这会起作用:

class ClassWithStaticMethod2 {

  static staticMethod = () => {
    return ('staticMethod');
  };

  static staticMethod2 = function() {
    console.log(this)
    const yee = this.staticMethod();
    return 'staticMethod2 '+yee;
  };

}

查看here

【讨论】:

  • 正如我上面所说,这不是箭头函数的“问题”。这就是它们的设计方式,也是它们生活的主要目的。有些人有点疯狂,并尝试在任何地方使用较短的语法,即使箭头函数的主要功能不是所需的行为。那只是一种错误的模式。当您希望this 值是词法时,应该使用箭头函数,而不是当您希望从object.method 中获取它时。必须为适当的工作使用适当的工具。我建议您按照这些思路改写您的答案。
  • 我在 Eran Hammer 看到了一段可爱的代码,他使用 function 而不是 () => {},有人问他原因;他的理由正是你所说的。在另一个演讲中,我看到使用... = function() 的原因是因为() => {} 形成了一个annon 函数的堆栈跟踪。我写错了答案,我会纠正它! O
猜你喜欢
  • 2018-09-25
  • 2019-01-06
  • 2019-12-17
  • 2016-07-02
  • 2016-12-29
  • 2018-01-08
  • 2022-01-21
  • 1970-01-01
相关资源
最近更新 更多