【发布时间】:2020-01-19 09:13:45
【问题描述】:
我又一次偶然发现了我不理解的 Javascript 行为。只要对象外部的变量发生更改,我就需要更新对象的属性。外部变量在对象属性中被引用,所以我认为我所要做的就是从外部更改变量并自动更改属性值。
这是代码的简化版本:
var serverPath = "123/";
var GetCurrentProductionApiConfig = {
URL: {
GetStart: serverPath + 'GetCurrentProduction?returnValue=start&',
GetEnd: serverPath + 'GetCurrentProduction?returnValue=end&',
Get: serverPath + 'GetCurrentProduction?returnValue=start&'
}
};
serverPath = "456/";
console.log(GetCurrentProductionApiConfig.URL.GetStart);
这将导致:
123/GetCurrentProduction?returnValue=start&
是因为变量已被复制(通过值传递)而不是指针(通过引用传递)吗?哪种方式是更新属性的正确方式?
【问题讨论】:
-
JS没有引用传递,一切都是值传递。但是,object 的值是它的引用。图元的值是一个直的图元。所以你不能基于原语动态地重新计算东西,例如
a = 1; b = 2 + a; a = 4不会改变b。与字符串相同。您可以拥有动态属性,但这是一个花哨的功能。 -
@VLAZ 感谢您提供的信息。传递给函数的 AFAIK 对象变量将是对外部对象的引用,而不是对象的副本,因此至少有类似“按引用传递”的东西。您将如何解决上述问题?用原型函数扩展对象以更新属性?
-
同样,对象的值是它的引用。所以 JS 总是按值传递,即使对于对象也是如此。但是如果你想拥有最新的值,那么你可以让你的属性实际上是方法,所以每次执行它们时,它们都会重新计算返回值。您可以使用getter 隐藏它,这是相同的东西,但它对于使用代码是透明的,
obj.dynamicValue实际上会执行一个函数而不是读取静态属性。 -
@VLAZ 非常感谢您的解释,尤其是链接的 SO 看起来很有希望。如果你能说出你的 cmets 的答案,我会接受这个作为解决方案。
标签: javascript