无法在 JavaScript 父类中调用静态方法

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)

Amj*_*mar 8

使用关键字在子级的非静态方法上调用父级的静态方法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)


Ant*_*ond 6

它不起作用,因为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() 调用整个链是静态的。也许在那种情况下它成功解决了超级。