Javascript - 如何更改对象属性而不重新分配它们

时间:2017-09-09 14:44:58

标签: javascript

下面的片段揭示了疑点

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

4 个答案:

答案 0 :(得分:13)

当你这样做时

var obj = {
  prop1 : 'my prop',
  prop2 : foo,        //referencing external variable
  prop3 : baz         //referencing external variable
}

prop2与变量foo(或prop3baz)之间存在正在进行的链接。所有这一切都是foo的当前被读取,并存储在prop2中(bazprop3也是如此)。

如果您需要prop2prop3保持与foobaz的关联,则可以使用 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)

这里发生了什么:

  1. 字符串"changed"已分配给变量foo
  2. foo的值已分配给obj.prop2
  3. 因为这个值是一个字符串(而不是数组,对象),obj.prop2只是获取值。它没有得到引用到foo,因为这些类型的值(字符串,整数,布尔值)可以按原样存储在obj中。
  4. 现在让我们尝试使用不同类型的相同内容:

    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分配的值不是字符串,整数或布尔值。相反,我们将引用分配给存储在内存中不同位置的数组。 bloopobj.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)