4

我正在尝试解决这个 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

现在我想更改onlysomething的属性,所以很自然地,我会这样做: field1

buf.field1.something = 0;

但是,这也会改变'field2something属性。我假设这是因为 Javascript 在变量定义过程中引用变量的方式。但是,在任何一种情况下,如果每次我需要在属性定义中使用它时,我怎么能绕过它而不显式调用它;{'something':0}像这样:

var buf = {'field1': {'something':0}, 'field2': {'something':1}};
4

2 回答 2

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 );

http://jsfiddle.net/XpVb5/2/

1

延伸阅读:“克隆对象的最优雅方式”

于 2013-11-12T22:19:51.833 回答
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

于 2013-11-12T22:21:27.270 回答