2014-10-26 77 views
1

問題顯得撲朔迷離,所以讓我解釋一下:如何使用對象的其他鍵內的鍵的值?

我在這個片段中的代碼工作:

sy: 100, 
sx: 50, 

x: 30, 
y: height - this.sy, 

我用「Y」的功能,但似乎功能沒有工作,所以我確實警覺(y);告訴我'v'的價值是'NaN'。然後我使用typeof運算符測試了'y',它告訴我它是'數字'類型的。我知道一個數字可以是'數字'類型,但仍然不是數字,所以我意識到問題出在'this.sy'部分。我認爲'this'僅用於函數,那麼如何在仍處於數組內部的情況下訪問'sy'呢? (高度已經定義在陣列之外)

+1

任何一段代碼,使用'this'必須表現出周圍的代碼的情況下比你讓我們知道什麼'this'的價值被設定爲。此外,您是否意識到'y'將在代碼初始化時計算一次,並且不會是動態值。 – jfriend00 2014-10-26 18:26:04

回答

1

更新:請參閱上面的getter回答,它允許語法類似於一個屬性,同時仍將實現保留爲函數。有一件事要注意,getter是隻讀的,所以如果你做obj.y = 4,那不會改變這個值。這可能被認爲是一個缺點,它可能會導致用戶認爲它可以改變。詳細信息,其中包括瀏覽器都支持,都在這裏:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get

原來的答案: 你需要爲y的函數:

var obj = { 
... 
y : function() { 
    return this.height - this.sy; 
}, 
... 
} 

警報(obj.y());

我假設高度是你已經定義的屬性。

+1

然後您無法通過「obj.y」訪問它。你必須通過「obj.y()」來訪問它! – 2014-10-26 18:11:13

+1

是的,我發佈了這個例子中的用法。但無論如何,我認爲吸氣劑是更好的解決方案。 – 2014-10-26 18:14:58

+0

如果你願意,你可以讓y settable。檢查我的答案。 – 2014-10-26 18:29:21

2

您可以使用一個getter:

var o = {sy: 100, 
     sx: 50, 

     x: 30, 
     get y() { return height - this.sy }, 
     }; 

稍後,您可以使用它作爲一個正常的屬性:

height = 10; 
o.y //gives -90 

你不能使用這個功能之外,因爲外面的功能它只是一個全局對象。所以在你的情況下,this.sy的值是undefined100-undefinedNaN

你甚至可以讓y設定通過定義setter方法:

var o = {sy: 100, 
      sx: 50, 

      x: 30, 
      get y() { return height - this.sy }, 
      set y(val) {Object.defineProperty(this, 'y', {value: val})}, 
      }; 
相關問題