下面的片段揭示了疑点
var foo = 'something'
var baz = 'other thing'
var obj = {
prop1 : 'my prop',
prop2 : foo, //referencing external variable
prop3 : baz //referencing external variable
}
// here we get the expected obj to be printed
console.log(obj)
// now I change one of the initial variable
foo = 'changed'
// here we get the sabe print as the first, that is the ~problem~
console.log(obj)
那么,如何打印'改变了#39;在prop2上没有重新分配obj.prop2 = foo
答案 0 :(得分:13)
当你这样做时
var obj = {
prop1 : 'my prop',
prop2 : foo, //referencing external variable
prop3 : baz //referencing external variable
}
prop2
与变量foo
(或prop3
和baz
)之间存在无正在进行的链接。所有这一切都是foo
的当前值被读取,并存储在prop2
中(baz
和prop3
也是如此)。
如果您需要prop2
和prop3
保持与foo
和baz
的关联,则可以使用 getters 制作这些属性。这些属性在它们被读取时触发函数调用(还有 setters 在设置属性时触发函数调用):
var obj = {
prop1 : 'my prop',
get prop2() { return foo; },
get prop3() { return baz; }
};
访问obj.prop2
是隐藏的函数调用。由于该函数会在foo
结束,因此会返回foo
的当前值。
直播示例:
var foo = 'something';
var baz = 'other thing';
var obj = {
prop1 : 'my prop',
get prop2() { return foo; },
get prop3() { return baz; }
};
console.log(obj);
foo = 'changed';
console.log(obj);

答案 1 :(得分:10)
由于JavaScript是按值传递而不是按引用传递,因此您无法通过将其直接指定给变量来覆盖以前的值。
您可以创建它的对象,并像这样更改对象的属性:
var foo = {value: 'something'}
var baz = 'other thing'
var obj = {
prop1 : 'my prop',
prop2 : foo, //referencing external variable
prop3 : baz //referencing external variable
}
console.log(obj)
foo.value = 'changed'
console.log(obj)

答案 2 :(得分:1)
这里发生了什么:
"changed"
已分配给变量foo
foo
的值已分配给obj.prop2
obj.prop2
只是获取值。它没有得到引用到foo,因为这些类型的值(字符串,整数,布尔值)可以按原样存储在obj
中。现在让我们尝试使用不同类型的相同内容:
var bloop = [1, 2, 3];
obj.prop4 = bloop;
console.log(obj.prop4); // [1, 2, 3]
bloop.push(4);
console.log(bloop); // [1, 2, 3, 4]
console.log(obj.prop4); // [1, 2, 3, 4]
在这种情况下,我们为obj.prop4
分配的值不是字符串,整数或布尔值。相反,我们将引用分配给存储在内存中不同位置的数组。 bloop
和obj.prop4
都在内存中保存对同一个数组的引用,因此如果更新了数组,则两者都将更新。
这实际上有两种方式:
obj.prop4.push(5);
console.log(obj.prop4); // [1, 2, 3, 4, 5]
console.log(bloop); // [1, 2, 3, 4, 5]
总而言之,如果您处理的是字符串,整数,布尔值等值,您将无法按照描述的方式更改对象的属性。它仅在object属性是对数组,对象等的引用时才有效。
答案 3 :(得分:0)
您只获取变量的值,而不是链接变量本身:
var foo = 'something'
var baz = 'other thing'
var obj = {
prop1 : 'my prop',
prop2 : foo, //getting the value of external variable
prop3 : baz //getting the value of external variable
}
console.log(obj)
// change the value of prop2
obj.prop2 = 'changed'
console.log(obj)