7

假设我有两个这样的 ES6 类:

class Base {
    static something() {
        console.log(this);
    }
}

class Derived extends Base {
}

然后我打了这样一个电话:

Derived.something();

请注意,我正在通过子类调用在超类上定义的静态方法。

这不会我错误。它打印

[Function: Derived]

所以this在静态方法中访问似乎在这里工作。

我需要一个用于超类的所有子类的通用静态方法,并且我需要能够知道哪个子类正在调用此方法。

现在我的问题是this在静态方法中使用是否合法。我知道这些静态方法成为类方法,因此this自然会指向调用它们的类对象。(类对象是构造函数。)

但我似乎找不到任何明确的资源表明 ES 规范允许这样做。

看起来像是对 ES6 类的一个很好的介绍,但没有谈论this.static

4

3 回答 3

10

在典型情况下,只要函数不是箭头函数、绑定函数或类似的东西(在这种情况下都不是) ,this任何调用中something.method()都会引用。something

类继承,甚至 ES6,在这里并不真正相关。所有你需要知道的是你在打电话Derived.something(),所以this会参考Derived

于 2018-05-11T05:02:44.607 回答
7

是的,this在静态方法中是合法的,这就是应该这样做的方式。

this在原型方法中引用类实例并在静态方法中引用类构造函数,除非方法未与其原始上下文绑定。

同样,super在实例方法中引用父类原型,在静态方法中引用父类构造函数

于 2018-05-11T05:17:18.480 回答
0

只要静态方法作为成员表达式调用,例如

Derived.something();

const { something } = Derived;
something();

然后this会参考DerivedDerived.something()something.call(Derived)ifDerived.something存储到中间变量相同,因为本质上,这就是计算具有嵌套调用表达式的成员表达式的方式。

于 2018-05-11T05:03:24.480 回答