1

JavaScriptでオブジェクトを配列に割り当てるときに奇妙な問題が発生しました ここに完全なコードがあります

var co = {'yAxis':10};

var dynCharts = new Array();

for (var x=0; x<2; x++){                  
    dynCharts[x] = co;   
}
//assigning to first array only 
dynCharts[0].yAxis = { 'a':'1'};
//now alert second array
alert(dynCharts[1].yAxis.a);

上記のコード例の場合、最初に co というオブジェクトがあり、そのオブジェクトを配列に割り当てています。ここで、最初の配列の yAxis というプロパティを変更したいのですが、2 番目の配列の yAxis オブジェクトの値も変更しています。

このコードの JSfiddle はこちら: http://jsfiddle.net/qvKaZ/

プロパティの方法でそれを行う方法がなぜ起こっているのか、誰かが私を助けてくれませんか?

4

3 に答える 3

1

配列のすべてのセルに同じオブジェクト (つまり、同じインスタンス) があります。

1 つの変更がすべてのセルに適用されないように、co を複製 (クローン) する必要があります。

for (var x=0; x<2; x++){                  
    dynCharts[x] = {yAxis:co.yAxis}; // this puts in dynCharts[x] a copy of co
}
于 2012-09-22T18:47:19.883 に答える
0

1つの方法は、を使用することです。Object.createこれにより、から継承する新しいオブジェクトが作成されcoます。

for (var x=0; x<2; x++){                  
    dynCharts[x] = Object.create(co);   
}

利点は、coいつでも更新できることです。更新されたプロパティが実際のオブジェクトにシャドウされていない限り、それを継承するすべてのオブジェクトに更新が表示されます。

古いブラウザを処理するには、このコードを含めます。

if (!Object.create) {
   Object.create = function(proto) {
       Object.create.F.prototype = proto;
       return new Object.create.F;
   };
   Object.create.F = function(){};
}

これは完全に準拠した代替品ではありませんが、上記で使用した基本的なケースでは機能します

于 2012-09-22T18:57:29.377 に答える
0

配列内のすべてのオブジェクトは、オブジェクトへの参照です。オブジェクトを変更すると、配列内のすべての値が更新されたように見えます。ループの反復ごとに、新しいオブジェクトを作成するか、既存のオブジェクトを複製する必要があります。

于 2012-09-22T18:48:46.063 に答える