我有这个代码,它将Node添加到数组然后更改它,firstNode
对象在init
函数中设置。
var myClass = function() {
this.items = []
this.firstNodeValues = {};
this.init = function() {
var firstIndex = false;
for (i = 10; i <= 15; i++) {
Node = {};
Node.index = i;
Node.name = "undefined";
if (i == 10) {
Node.name = "John"
this.firstNodeValues = Node;
}
this.items[i] = Node;
}
}
this.iterate = function() {
var newIndex = 10;
for (i = 10; i <= 15; i++) {
this.items[i].index = newIndex;
if (i == 10) {
this.items[i].name = "Michael";
}
newIndex++;
}
}
}
var test = new myClass();
test.init();
console.debug(test.firstNodeValues.name) // this gives value "John"
test.iterate();
console.debug(test.firstNodeValues.name) // this gives value "Michael"
第二次调试返回"Michael"
但为什么?它看起来firstNodeValues
有一个指向节点items[10]
的指针
我希望如果我在FirstNodeValues
中设置firstTime
以及稍后更改节点值,则firstNodeValues
不会更改并保持与我第一次设置完全相同。
答案 0 :(得分:1)
更改数据时克隆更改的原因如下:
this.firstNodeValues = Node;
在那里,您声明firstNodeValues
是引用到Node
,而不是副本。因此,您在firstNodeValues
中更改的所有内容,Node
中的更改,反之亦然。
您需要克隆该对象,如下所示:
function clone(obj){
if(obj == null || typeof(obj) != 'object'){
return obj;
}
var temp = {};
for(var key in obj){
if(obj.hasOwnProperty(key))){
temp[key] = clone(obj[key]);
}
}
return temp;
}
然后,您可以复制节点,如下所示:
this.firstNodeValues = clone(Node);
这将确保this.firstNodeValues
不是Node
的引用,而是一个新对象,其属性/值与Node
相同(因此,克隆)。
答案 1 :(得分:-1)
您可能对jQuery.extend()感兴趣。所以:
this.firstNodeValues = $.extend( {}, Node );