为什么静态方法不能在实例方法或构造函数

时间:2017-01-12 15:49:15

标签: javascript ecmascript-6

以下是代码:

class Foo {
    static m() {
        console.log('m');
    }
}
class Bar extends Foo { 
    b() {
        super.m();
    }
}

var b = new Bar();
b.b();

抛出:

Uncaught TypeError: (intermediate value).m is not a function

当我尝试在实例方法或构造函数中使用父类静态方法时,会生成此类错误。为什么呢?

据我了解,super指的是Foo,以下工作正常:

class Bar extends Foo { 
    b() {
        Foo.m();
    }
}

2 个答案:

答案 0 :(得分:4)

因为super属性引用实例方法中的Foo.prototype属性,而super属性引用静态方法中的Foo静态属性。

构造函数中的

super(...)调用具有特殊含义,并在内部执行类似Foo.call(this, ...)的操作。

super没有意义,不能用作常规变量。

应该是:

b() {
    this.constructor.m();
}

因为Barm继承了Foo静态方法。

或者如果它特别应该是父类,

b() {
    super.constructor.m();
}

答案 1 :(得分:0)

尝试检查Foo的实例。 您将看到m不是Foo实例的常规成员,但它作为公共静态方法被“挂钩”在constructor下。

要使代码生效,只需将b上的Bar class方法定义更改为:

b() {
    super.constructor.m();
}

有关此主题的更多信息,请访问:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static