0

我有这段代码,将节点添加到数组然后更改它,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]
我希望如果我设置FirstNodeValuesinfirstTime和后来的更改节点值,那么firstNodeValues不是 Changes 并保持与我第一次设置它的完全相同。

4

2 回答 2

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

于 2013-01-11T12:55:50.680 回答
-1

您可能对jQuery.extend()感兴趣。所以:

this.firstNodeValues = $.extend( {}, Node );

于 2013-01-11T13:02:40.207 回答