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

Lea*_*des 6 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)
Run Code Online (Sandbox Code Playgroud)

那么,如何在没有重新分配的情况下在prop2上打印"已更改" obj.prop2 = foo

T.J*_*der 15

当你这样做

var obj = {
  prop1 : 'my prop',
  prop2 : foo,        //referencing external variable
  prop3 : baz         //referencing external variable
}
Run Code Online (Sandbox Code Playgroud)

没有之间正在进行的链路prop2和可变foo(或prop3baz).所有这一切发生的是,当前foo读取,并存储在prop2(与同为bazprop3).

如果您需要prop2prop3保持链接到foobaz,您可以使用getter创建它们的属性.这些属性在读取时触发函数调用(还有设置器在设置属性时触发函数调用):

var obj = {
  prop1 : 'my prop',
  get prop2() { return foo; },
  get prop3() { return baz; }
};
Run Code Online (Sandbox Code Playgroud)

访问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);
Run Code Online (Sandbox Code Playgroud)


Iva*_*var 11

由于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)
Run Code Online (Sandbox Code Playgroud)

  • 很好的选择. (3认同)