【问题标题】:Can't call static method in JavaScript parent class无法在 JavaScript 父类中调用静态方法
【发布时间】:2018-01-27 03:21:22
【问题描述】:

我正在尝试从父类cars 访问静态方法baseArea,但它显示以下错误:

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);

【问题讨论】:

  • 通常不会在对象上调用的静态函数。你在课堂上给他们打电话。
  • super.baseArea() 应该是Cars.baseArea()。
  • 或Bike.baseArea()
  • 请参见 Super class calls with super 下的示例developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 他们还使用super 调用静态方法@ 是如何工作的?
  • 这可能是因为pingpong 方法也是静态的并且使用Computer.pingpong() 而不是new Computer().pingpong() 调用整个链是静态的。也许在那种情况下它成功解决了超级。

标签: javascript class ecmascript-6


【解决方案1】:

它不起作用,因为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 的示例中,它很可能有效,因为 pingpong 方法也是静态的并且使用 Computer.pingpong() 而不是 new Computer().pingpong() 调用整个链是静态的。也许在那种情况下它会成功解决超级问题。

【讨论】:

  • 查看我的评论。
【解决方案2】:

你可以改变你的

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());

【讨论】:

    【解决方案3】:

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

    或

    你可以改变,

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

    到,

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

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

    【讨论】:

    • 查看我的评论。
    【解决方案4】:

    使用super关键字在子非静态方法上调用父静态方法

    class Bike extends Cars {
        get bikeArea() {
            return super.constructor.baseArea();
        }
    }
    

    但是,要使用super 关键字在子级的静态 方法上调用父级的静态 方法

    class Bike extends Cars {
        static bikeArea() {
            return super.baseArea();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 2012-09-25
      • 2011-01-13
      相关资源
      最近更新 更多