Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在对象的另一个键内使用一个键的值?_Javascript_Arrays_This - Fatal编程技术网

Javascript 如何在对象的另一个键内使用一个键的值?

Javascript 如何在对象的另一个键内使用一个键的值?,javascript,arrays,this,Javascript,Arrays,This,这个问题似乎令人困惑,所以让我解释一下: 我正在处理这段代码: sy: 100, sx: 50, x: 30, y: height - this.sy, 我在函数中使用了“y”,但函数似乎不起作用,所以我发出了警报(y);它告诉我v的值是NaN。然后我用typeof操作符测试了“y”,它告诉我它是“number”类型。我知道数字可以是'number'类型,但仍然不是数字,所以我意识到问题出在'this.sy'部分。我认为“this”仅用于函数,那么,在数组中访问“sy”时,我将如何进行操作?

这个问题似乎令人困惑,所以让我解释一下:

我正在处理这段代码:

sy: 100,
sx: 50,

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

我在函数中使用了“y”,但函数似乎不起作用,所以我发出了警报(y);它告诉我v的值是NaN。然后我用typeof操作符测试了“y”,它告诉我它是“number”类型。我知道数字可以是'number'类型,但仍然不是数字,所以我意识到问题出在'this.sy'部分。我认为“this”仅用于函数,那么,在数组中访问“sy”时,我将如何进行操作?(高度已在数组外部定义)

更新:请参阅上面的getter答案,该答案允许语法类似于属性,同时仍将实现保留为函数。需要注意的一点是,getter是只读的,因此如果执行obj.y=4,则不会更改该值。这可能被认为是一个缺点,它可能会让用户相信它是可以改变的。详细信息,包括支持哪些浏览器,如下所示:

原始答复: 您需要使y成为一个函数:

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

我假设高度是您已经定义的属性。

您可以使用getter:

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

         x: 30,
         get y() { return height - this.sy },
         };
稍后,您可以将其用作普通属性:

height = 10;
o.y //gives -90
您不能在函数外部使用它,因为在函数外部它只是一个全局对象。因此在您的例子中,
this.sy
的值是
undefined
100 undefined
NaN

您甚至可以通过定义setter使
y
可设置:

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

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

那么您就不能用“obj.y”访问它。您必须使用“obj.y()”访问它。。。!是的,我已经在示例用法中发布了。但不管怎样,我认为getter是一个更好的解决方案。如果你愿意,你可以设置y。检查我的答案。是的,谢谢你提到这一点。我的观点是,单独使用getter可能会引起混乱。如果属性是只读的,那么使用getter而不是显式函数可能会向不熟悉其语义的对象用户屏蔽属性的只读性质。任何使用
this
的代码都必须显示比您更多的代码上下文,以便我们知道
this
的值设置为多少。此外,还不清楚您是否意识到
y
将在代码初始化时计算一次,而不是动态值。