我正在尝试将这个javascript变量引用问题。这是一个小提琴来展示我将要解释的内容:http://jsfiddle.net/XpVb5/1/
我有一个对象,我想在一个单独的对象的属性中定义和调用。
var vals = {'something':1}; //original object
var buf = {'field1': vals, 'field2': vals}; //second object with original object used as properties
现在我想更改 something
的{{1}}属性,所以我自然会这样做:
field1
但是,这将还更改buf.field1.something = 0;
的{{1}}属性。我假设这是因为Javascript如何在变量定义过程中引用变量。但是,在任何一种情况下,每次我需要在属性定义中使用它时,如何在没有显式调用field2
的情况下解决此;像这样:
something
答案 0 :(得分:3)
您需要创建vals对象的副本。目前,您只是在两个地方提供对象的引用。修改基础对象时,更改将同时出现在buf(field1 + field2)中,因为它们仅向基础对象提供引用。
注意:我正在使用JSON.parse(JSON.stringify($ vals))作为如何复制$ vals对象的快速示例。
var $vals = {"something":1},
buf = {"field1": JSON.parse(JSON.stringify($vals)), "field2": JSON.parse(JSON.stringify($vals))};
//change the 'something' field for one of the buf properties
buf.field1.something = 0;
//see if the 'something' field changed for the other buf property
alert( buf.field2.something );
给出
1
答案 1 :(得分:1)
可以将$vals
更改为返回对象的函数。每个返回将是一个不同的实例
var $vals = function(){
return {"something":1}
}
var buf = {"field1": $vals(), "field2": $vals()};
//change the 'something' field for one of the buf properties
buf.field1.something = 0;
//see if the 'something' field changed for the other buf property
alert( buf.field2.something );
的 DEMO 强>