Javascript变量范围和引用

时间:2013-11-12 22:15:53

标签: javascript variables object properties

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

2 个答案:

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

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

给出

1

进一步阅读:"The most elegant way to clone an object"

答案 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