2011-03-12 66 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