2017-01-22 91 views
1

我定義一個對象,我想計算它的一個特性與另一個它計算對象的屬性值的屬性。與另一個屬性

// first the calculation function 
const calculateArea = (height, width) => { 
    return height * width 
} 

// then the object itself... 
const myObj = { 
    height: 20, 
    width: 10, 
    area: calculateArea(this.height, this.width) 
} 

我以爲我可以使用this.heightthis.width到我定義對象中訪問的屬性,但我得到

無法讀取的不確定

「高度」我在哪裏出錯了,有什麼解決辦法?

+0

[對象字面聲明中的自引用]的可能重複(http://stackoverflow.com/questions/4616202/self-references-in-object-literal-declarations) – Li357

+0

它需要在對象被調用後調用創建時,您仍然無法在定義對象屬性時引用它。 –

+1

'常量MyObj中= { 高度:20, 寬度:10, 面積:功能(){ 返回this.height * this.width } }' – Smiranin

回答

0

這個怎麼樣:

function myObj(height, width) { 
    this.height = height; 
    this.width = width; 
    this.area = calculateArea(height, width); 
} 

let obj = new myObj(20, 10); 
0

的問題是,你正在嘗試引用您的對象與這個,雖然不存在了。該這個你可以參考不確定(如你的情況),然後導致錯誤「未定義無法讀取x屬性」。

但是,這個可能會根據情況綁定到上下文中的另一個對象。在這種情況下,你不會採取這種錯誤,無論值對應於綁定的對象將返回爲

試圖獲取從檢索值這個對象可能會導致2例,這兩者是不是你想要的東西。

  • 檢索到的寬度高度屬性,讓你的功能會得到這些值,並計算相應的結果。但是這些價值觀不會是你在對象中傳遞的價值觀。
  • 檢索到的沒有一個寬度高度屬性,讓你的功能將得到不確定,因爲它的參數,並相應地給出錯誤。

有很多方法可以解決這個問題。這是我的主張:

這裏的主要問題是區域的值是在構建對象時急切計算的。凍結計算並在創建對象後觸發它將計算對象內的正確值。

// first the calculation function 
const calculateArea = (height, width) => { 
    return height * width 
} 

// then the object itself... 
const myObj = { 
    height: 20, 
    width: 10, 
    // init, is a function that uses bounded context's width, height 
    init: function() { 
     this.area = calculateArea(this.height, this.width); 
     delete this.init; // We don't want init in our result object 
     return this; 
    } 
}.init(); 

現在,當我們調用對象的init(),我們將有我們的指向正確的對象。它會用this.widththis.height來計算面積。它也將刪除結果對象中的init()函數,返回的對象作爲你想要的形式。

我們剛剛暫停計算一個步驟,讓我們的這個指向正確的上下文,然後繼續。

相關問題