2011-04-28 119 views
2

我的问题很简单,我想,但我找不到一个简单的解决方案。这里是例子:JavaScript传递变量作为值而不是作为参考

var obj1 = { 
    m1:"a", 
    m2:"b" 
}; 

var obj2 = { 
    m:obj1 
}; 


obj2.m.m1 = "c"; 


document.write(obj2.m.m1+"<br>"); //output: c 

document.write(obj1.m1+"<br>"); // output: c (I wanted to be a) 

所以..我需要做什么才能从obj1.m1返回“a”?

预先感谢

+0

[JavaScript的如何创建参考]的可能重复(http://stackoverflow.com/questions/5823870/javascript-how-to-create-reference) – Quentin 2011-04-28 19:59:46

+0

@大卫Dorwad其实我在寻找的相反的事情。如何将对象作为值传递而不是作为参考 – 2011-04-28 20:02:48

回答

6

您需要将obj2.m设置为obj1的克隆,而不是obj1本身。例如:

function clone(obj) { 
    var result = {}; 
    for (var key in obj) { 
     result[key] = obj[key]; 
    } 
    return result; 
} 

var obj2 = { 
    m: clone(obj1) 
}; 

obj2.m.m1 = "c"; // does not affect obj1.m1 
+0

请注意,我特别/不/将'clone'函数附加到'Object.prototype',因为那是一般,一个非常糟糕的想法。另外,这是一个克隆函数的一个非常简单的实现;对于更完整的一个,请查看jQuery.extend的实现。 – 2011-04-28 20:17:09

4
+0

这是一篇很棒的文章,感谢您的分享! – Andre 2011-04-28 20:05:59

+3

请注意,增加Object对象是一个非常糟糕的主意,因为它除非仔细筛选原型,否则会中断for for的使用。请参阅:http://erik.eae.net/archives/2005/06/06/22.13.54/ – 2011-04-28 20:10:53

1

obj1obj2.m指向相同对象。您不能有obj1.m1 != obj2.m.m1

您可以做的是将obj1的副本分配给obj2.m。查看将发布的链接。

0

您需要首先克隆它。

Object.prototype.clone = function() { 
    var newObj = (this instanceof Array) ? [] : {}; 
    for (i in this) { 
    if (i == 'clone') continue; 
    if (this[i] && typeof this[i] == "object") { 
     newObj[i] = this[i].clone(); 
    } else newObj[i] = this[i] 
    } return newObj; 
}; 

var obj1={ m1:"a", m2:"b" }; 
var obj2={ m: {}}; 
obj2.m = obj1.clone(); 
obj2.m.m1="c"; 
document.write(obj2.m.m1+"<br>"); 
document.write(obj1.m1+"<br>");