2016-05-12 61 views
0

我创建了一个具有一个半径值的圆和两个函数来计算面积和周长的构造函数,我试图将计算的面积和周长值作为要构建的对象的元素,但它不起作用。如何使用构造函数的输出将值插入到对象中?

function Circle (r) { 
     this.radius = r; 
     this.area = function() { 
      var a = Math.PI * this.radius * this.radius; 
      // tried this 
      this.areaaaa = a; 

     }; 



     this.perimeter = function(){ 
      var p = Math.PI * this.radius * 2; 
      // tried this too 
      this.perimeterrrr = p; 

      }; 



    }; 

    var x = new Circle(5); 

    console.log(x); 

    // output is {radius:5, area: [function], perimeter: [function]} 

// desired output is {radius:5, area: [function],areaaa:78.54, perimeter: [function], perimeterrrr:31.42} 
+1

但是,为什么?如果稍后更改半径,您的对象将具有不一致的值。 –

+1

现在,你正在定义称为'area'和'perimeter'的方法,但是你永远不会调用这些方法。你真的希望他们成为吸气者吗? – apsillers

+0

我认为你没有得到我的观点,我想要做的就是以自动方式将区域和边界的计算值作为另一个对象值传递,而不是为每个计算值手动输入 – Adam

回答

2

问题是这些函数定义中的代码永远不会运行。尝试这个。

function Circle (r) { 
    this.radius = r; 
    this.a = Math.PI * this.radius * this.radius; 
    this.p = Math.PI * this.radius * 2; 
}; 

var x = new Circle(5); 

console.log(x); 
+0

我不明白这些函数中的代码是什么意思,永远不会运行,以及如何做如果是这样,我会运行它们? – Adam

+2

@Adam这意味着你不运行这些功能。试想一下,如果你从未做过“新圈子(5)”。你会期望'Circle'中的代码在没有告诉它运行的情况下运行吗?你必须运行这些函数,否则它们内部的代码不会运行。 – apsillers

+2

对于要运行的this.area和this.perimeter中的行,您需要在'var x = new Circle(5)'之后向'x.area'或'x.perimeter'添加一个调用。之后,将设置x.areaaaa和x.perimeterrrr。 – Shaun

4

您可以使用​​

function Circle (r) { 
    this.radius = r; 
    Object.defineProperty(this, "area", { get: function() { return Math.PI * this.radius * this.radius; } }) 

}; 

var circle = new Circle(5) 
circle.radius //5 
circle.area //78.53981633974483 
+1

只需注意:'Object.defineProperty'从ES5开始就存在;这不是一个新的ES6功能。 – apsillers

+0

@apillers感谢您的信息!那么文档就会令人困惑。从ECMAScript 6开始,你也可以使用表达式来计算属性名称来绑定到给定的函数。'我猜他们是指使用函数作为值属性的{{get:'键。 –

+0

指的是对象文字的{{get prop(){...}}'语法,而不是与'Object.defineProperty'有关的任何语法。 ES6允许您在对象文字上使用运行时计算的属性名称。 – apsillers

相关问题