2013-05-14 132 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