【问题标题】:how to remove this error TypeError: a.area is not a function at eval?如何消除此错误 TypeError: a.area is not a function at eval?
【发布时间】:2015-09-08 02:59:40
【问题描述】:

http://www.es6fiddle.net/iearlj80/

你好 我正在尝试学习 ES6。但是我收到了错误 TypeError: a.area is not a function at eval 为什么?其实我是这样调用函数函数的

class Polygon {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }

  get area() {
    return this.calcArea()
  }

  calcArea() {
    return this.height * this.width;
  }
}

var a =new Polygon(10,20)
alert(a.area())

当我像这样使用 a.calcArea() 时它可以工作,但是当我像这样使用 a.area() 时它会出错?为什么 ?

【问题讨论】:

  • 为什么你在一个定义中使用get 而不是另一个?也许这就是为什么有区别......

标签: javascript jquery ecmascript-6


【解决方案1】:

因为您将函数定义为 get area(){},这实际上是在对象上定义 getter 的方式。

所以你不需要调用它

这样说

alert(a.area)

而不是

alert(a.area())

updated demo

参考资料(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get)

【讨论】:

  • 为什么面积是功能?这不是财产?
  • @user944513:函数也可以是属性。属性只是对象的“条目”。属性的可以是任意的。它可以是数字、字符串、对象甚至函数。但是get 创建了一种特殊的属性,即“访问器属性”,其值由您提供的函数计算得出。在使用之前了解更多关于 get 的信息(参见 MDN)。
【解决方案2】:

a.area() 如果你有的话会工作

area() {

如果你有

get area() {

您已经声明了一个属性 getter,这意味着您可以通过直接读取 .area 来获取该区域。

第一个声明了一个具有函数值的类原型属性。 第二个声明了一个具有访问器“getter”函数的类原型属性。尝试访问.area 将调用您的area 函数,结果将是返回值。

例如,要让.area() 使用您的语法,应该是这样的:

get area(){
    return function(){
        return 4;
    };
}

那么你可以做a.area() === 4,但你也可以做

area(){
    return 4;
}

【讨论】:

  • 是 get area() 是财产吗?还是函数?
  • @user944513 一切都是属性,只是属性可以存储值,或者自动调用以获取值的函数(这是您尝试使用的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
  • 2019-02-13
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多