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

时间:2017-08-18 12:27:23

标签: 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

但是当我使用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);

3 个答案:

答案 0 :(得分: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());

答案 1 :(得分:2)

您可以简单地拨打Bike.baseArea()而不是bike.bikeArea(),因为它已扩展为包含Cars

你可以改变,

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

要,

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

从而允许您将其称为Bike.bikeArea()

答案 2 :(得分: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()整个链是静态的。也许在那种情况下它成功地解决了超级。