Vik*_*kas 5 javascript class ecmascript-6
我试图baseArea从父类访问静态方法,cars但它显示以下错误:
test.php:34 Uncaught TypeError: (intermediate value).baseArea is not a function
at Bike.get bikeArea [as bikeArea] (test.php:34)
at test.php:42
Run Code Online (Sandbox Code Playgroud)
但是当我使用baseArea () {}而不是它时效果很好static baseArea() {}
我究竟做错了什么?
class Cars {
constructor(x, y) {
this.height = x;
this.width = y;
}
static baseArea() {
return 44;
}
}
class Bike extends Cars {
constructor(flag) {
super(flag, flag);
}
get bikeArea() {
return super.baseArea();
}
}
let bike = new Bike(10);
console.log(bike.bikeArea);
Run Code Online (Sandbox Code Playgroud)
使用关键字在子级的非静态方法上调用父级的静态方法super
class Bike extends Cars {
get bikeArea() {
return super.constructor.baseArea();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,要使用关键字在子静态方法上调用父静态方法super
class Bike extends Cars {
static bikeArea() {
return super.baseArea();
}
}
Run Code Online (Sandbox Code Playgroud)
它不起作用,因为super.正在引用类实例。静态方法不附加到实例,而是附加到类本身。
但是,以下内容将起作用:
class Cars {
constructor(x, y) {
this.height = x;
this.width = y;
}
static baseArea() {
return 44;
}
}
class Bike extends Cars {
constructor(flag) {
super(flag, flag);
}
get bikeArea() {
return Bike.baseArea();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意Bike.baseArea()(为了可读性,可以这样称呼它:)Cars.baseArea()。
在您在此处链接的示例中,它可能有效,因为 pingpong 方法也是静态的并且使用 Computer.pingpong() 而不是 new Computer().pingpong() 调用整个链是静态的。也许在那种情况下它成功解决了超级。