寫我的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