javascript对象属性具有指向另一个属性的指针

时间:2013-01-11 12:48:43

标签: javascript

我有这个代码,它将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不会更改并保持与我第一次设置完全相同。

2 个答案:

答案 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 );