0

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"

2 番目のデバッグが返されます"Michael"が、なぜですか? ノードfirstNodeValuesへのポインタがあるようitems[10]です。後で変更ノードの値を設定した場合、それは変更ではなく、最初に設定したときとまったく同じままで
あることを望みます。FirstNodeValuesfirstTimefirstNodeValues

4

2 に答える 2

1

データを変更するとクローンが変更される理由は次のとおりです。

this.firstNodeValues = Node;

そこでは、コピーではなく、への参照firstNodeValuesであることを宣言しています。したがって、 で変更したものはすべて で変更され、その逆も同様です。NodefirstNodeValuesNode

次のように、オブジェクトを複製する必要があります。

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 に答える