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

问题描述 投票:2回答:3

我正在尝试从父类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

但是当我使用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);
javascript class ecmascript-6
3个回答
2
投票

它不起作用,因为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();
    }
}

请注意Bike.baseArea()(为了便于阅读,可以这样称呼:Cars.baseArea())。

在您链接here的示例中,它可能是有效的,因为乒乓方法也是静态的并且使用Computer.pingpong()而不是新的Computer()调用.pingpong()整个链是静态的。也许在那种情况下它成功解决了超级。


3
投票

你可以改变你的

get bikeArea(){
   return super.baseArea();
}

get bikeArea(){
   return Cars.baseArea();
}

或者你可以简单地使用它:

class Cars {
    constructor(x, y) {
        this.height = x;
        this.width = y;
    }

    baseArea() {
        return 44;
    }
}

class Bike extends Cars {
    constructor(flag) {
        super(flag, flag);
    }

    bikeArea() {
        return super.baseArea();
    }
}

let bike = new Bike(10);
console.log(bike.bikeArea());

2
投票

您可以简单地调用Bike.baseArea()而不是bike.bikeArea(),因为它已经扩展到包括Cars

要么

你可以改变,

get bikeArea() {
    return super.baseArea();
}

至,

static bikeArea() {
    return super.baseArea();
}

从而允许你称之为Bike.bikeArea()

© www.soinside.com 2019 - 2024. All rights reserved.