2011-03-12 70 views
3

写我的JavaScript时,我已经注意到这个问题了,我一直无法找出原因:JavaScript:将对象存储为固定值?

下面是一些代码来重现问题的行为。

 
var o1 = { 
    num: 1 
} 
var o2 = o1; 
o2.num = 2; 
alert(o1.num); 

预期结果:浏览器提醒1,因为我只改变了 O2对象,而不是对象的属性。

实际结果:浏览器警报2,因为它似乎等于 O2

我不确定发生了什么事。如何修复代码,以便提醒1而不是2(假设没有更改)?

非常感谢提前。

+0

“o2”成为“o1”的参考 – Bakudan 2011-03-12 23:21:09

回答

5

因为两个变量参考相同的对象。对象在变量赋值时不被克隆/复制。 You would have to do this yourself

在这种情况下,JavaScript的行为与任何(大多数)其他OO语言一样。

3

通过书写var o2 = o1;您正在制作o1o2两个引用相同的对象。你想要做的是克隆o1对象和存储克隆副本o2。在JavaScript中搜索克隆对象。

2

因为您将对象设置为相同的参考点。您需要克隆该对象。这里是来自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()); 
+2

请记住,uneval()仅在Firefox上可用。据我所知,它不适用于IE,Chrome和Safari。 – rsp 2011-03-12 23:34:06

+2

在Chrome中绝对不能使用(只是测试过它)。 – 2011-03-12 23:45:53