2014-10-26 76 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})}, 
      }; 
相关问题