JavaScript传递变量作为值而不是作为参考
我的问题很简单,我想,但我找不到一个简单的解决方案。这里是例子: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”?
预先感谢
您需要将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
请注意,我特别/不/将'clone'函数附加到'Object.prototype',因为那是一般,一个非常糟糕的想法。另外,这是一个克隆函数的一个非常简单的实现;对于更完整的一个,请查看jQuery.extend的实现。 – 2011-04-28 20:17:09
这是一篇很棒的文章,感谢您的分享! – Andre 2011-04-28 20:05:59
请注意,增加Object对象是一个非常糟糕的主意,因为它除非仔细筛选原型,否则会中断for for的使用。请参阅:http://erik.eae.net/archives/2005/06/06/22.13.54/ – 2011-04-28 20:10:53
obj1
和obj2.m
指向相同对象。您不能有obj1.m1 != obj2.m.m1
您可以做的是将obj1
的副本分配给obj2.m
。查看将发布的链接。
您需要首先克隆它。
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>");
[JavaScript的如何创建参考]的可能重复(http://stackoverflow.com/questions/5823870/javascript-how-to-create-reference) – Quentin 2011-04-28 19:59:46
@大卫Dorwad其实我在寻找的相反的事情。如何将对象作为值传递而不是作为参考 – 2011-04-28 20:02:48