2016-05-12 22 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

相關問題