2013-05-14 211 views
1

所以我有一個會話變量req.session.user,它包含一個對應於用戶帳戶的對象。當我這樣做時,如何保持會話變量不變?

var user = req.session.user; 
var fakeUser = user; 
fakeUser.username = 'bob'; 

user.username和req.session.user.username都變爲'bob'。我如何防止這種情況?

+0

你的意思是你需要一個「價值副本」而不是「參考副本」? – AliBZ 2013-05-14 00:17:25

回答

0

克隆它

function clone(obj) { 
    if (null == obj || "object" != typeof obj) return obj; 
    var copy = obj.constructor(); 
    for (var attr in obj) { 
     if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; 
    } 
    return copy; 
} 
+0

完美工作。謝謝! – user1816679 2013-05-14 17:10:23

0

當您編寫var fakeUser = user時,將複製對象用戶的引用 - fakeUser仍然引用相同的對象。

如果你想複製的對象,你要複製它或複製用戶的唯一期望的特性:如:

var fakeUser = { 
    name: user.name, 
    id: user.id 
} 

JS clonning在以下答案中描述:

answer 1 answer 2

您也可以使用下劃線庫的clone method(但請注意,它只是做一個淺拷貝(不深) - 即如果用戶對象包含一些引用,它們被複製作爲參考)。

克隆對象的簡單方法是隻序列化和deserilaze它(但這不會對循環引用的工作 - 當對象引用本身或它的一部分):

function clone(a) { 
    return JSON.parse(JSON.stringify(a)); 
} 
+0

你能解釋克隆嗎? – AliBZ 2013-05-14 00:17:47

+0

我已添加一個關於克隆問題的鏈接。 Clonning意味着您將對象的所有屬性複製爲值(使用=以這種方式複製基本類型),而不僅僅是引用(使用=以這種方式複製對象)。 – lopisan 2013-05-14 00:23:09

+0

我知道,但如果您不是對象的創建者,您將面臨問題。 @ zavg的答案是正確的做法。通過解釋我的意思,請說是否有一個功能來做到這一點,或者你必須手動完成。對不起,我不清楚。 – AliBZ 2013-05-14 00:25:19