以下是代码:
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();
}
}
答案 0 :(得分:4)
因为super
属性引用实例方法中的Foo.prototype
属性,而super
属性引用静态方法中的Foo
静态属性。
super(...)
调用具有特殊含义,并在内部执行类似Foo.call(this, ...)
的操作。
super
没有意义,不能用作常规变量。
应该是:
b() {
this.constructor.m();
}
因为Bar
从m
继承了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