写我的JavaScript时,我已经注意到这个问题了,我一直无法找出原因:JavaScript:将对象存储为固定值?
下面是一些代码来重现问题的行为。
var o1 = { num: 1 } var o2 = o1; o2.num = 2; alert(o1.num);
预期结果:浏览器提醒1,因为我只改变了 O2对象,而不是对象的属性。
实际结果:浏览器警报2,因为它似乎等于 O2。
我不确定发生了什么事。如何修复代码,以便提醒1而不是2(假设或没有更改)?
非常感谢提前。
写我的JavaScript时,我已经注意到这个问题了,我一直无法找出原因:JavaScript:将对象存储为固定值?
下面是一些代码来重现问题的行为。
var o1 = { num: 1 } var o2 = o1; o2.num = 2; alert(o1.num);
预期结果:浏览器提醒1,因为我只改变了 O2对象,而不是对象的属性。
实际结果:浏览器警报2,因为它似乎等于 O2。
我不确定发生了什么事。如何修复代码,以便提醒1而不是2(假设或没有更改)?
非常感谢提前。
因为两个变量参考相同的对象。对象在变量赋值时不被克隆/复制。 You would have to do this yourself。
在这种情况下,JavaScript的行为与任何(大多数)其他OO语言一样。
通过书写var o2 = o1;
您正在制作o1
和o2
两个引用相同的对象。你想要做的是克隆的o1
对象和存储克隆副本在o2
。在JavaScript中搜索克隆对象。
因为您将对象设置为相同的参考点。您需要克隆该对象。这里是来自http://www.thespanner.co.uk/2008/04/10/javascript-cloning-objects/的一段代码,它允许用原型进行克隆。
Object.prototype.clone = function() {
return eval(uneval(this));
}
alert("test".clone());
alert((3).clone());
alert(clone.clone());
请记住,uneval()仅在Firefox上可用。据我所知,它不适用于IE,Chrome和Safari。 – rsp 2011-03-12 23:34:06
在Chrome中绝对不能使用(只是测试过它)。 – 2011-03-12 23:45:53
“o2”成为“o1”的参考 – Bakudan 2011-03-12 23:21:09