2012-04-14 10 views
4
myObj = { 
    prop1: 'alpha', 
    prop2: 'beta', 
    priceUpdatedOn: new Date() 
    }; 

    myObjQuery = myObj; 
    delete myObjQuery.priceUpdatedOn; 

console.log(myObj); 
console.log(myObjQuery); 

をオブジェクトをコピーした後、オブジェクトのプロパティを削除するとき、priceUpdatedOnは、何らかの理由で、同様myObjから削除されます。どんな考え?奇妙な行動私はそれを行うと

+0

:[Javascriptのクローン化されたオブジェクトが、そのプロトタイプの機能を失っ](http://stackoverflow.com/questions/10151216/javascript-cloned-object-looses-its-prototype-functions ) – RobG

+0

JavaScriptオブジェクトをクローンする方法は本当ですか?* – alex

答えて

3

JavaScriptは参考になります。 myObjQueryとmyObjはメモリ内の同じデータへの参照です。 1つのプロパティを変更すると、メモリ内のコピーが変更されるため、そのすべての参照が変更されます。あなたがオブジェクトのコピーを作成しないを行いますが、あなたはそのコマンド

myObjQuery = myObj; 

clone the object代わり

4

これは、myObjQueryとmyObjが同じオブジェクトであるためです。 myObjQuery = myObjを実行すると、オブジェクト自体のコピーではなく、そのオブジェクトへの参照のコピーが作成されます。 JavaScriptでオブジェクトを直接操作することはなく、常に参照を使用します。

EDIT: JavaScriptのオブジェクトのクローン作成は簡単ではありません。 jQueryやExtのようなほとんどのライブラリにはそれを行う手段があります。手動で行うには、このようなものが動作します。

var clone = {}; 
for(var prop in myObj) { 
    if(myObj.hasOwnProperty(prop)) { 
     clone[prop] = myObj[prop]; 
    } 
} 

浅いコピーであることに注意してください。ディープコピーを行うには、プロパティ自体がオブジェクトであるかどうかを検出し、再帰的にもそれらを複製する必要があります。あなたのためにこれをすべて行うライブラリを使うのがベストです。また、これには多くのエッジケースがあり、オブジェクトのコンストラクタプロパティのような奇妙なものがないことに注意してください。 JavaScriptは本当に乱雑です。

+0

どうすればオブジェクトを複製できますか? – Shamoon

+0

@Shamoon - 私は答えを編集し、JS –

+1

@ jimwのオブジェクトを複製する方法を追加しました。この質問に答えない質問を参照するポイントはありません。受け入れられた答えは、OPにオブジェクトのコピーや複製について多くのことを伝えません。 – RobG

1

に持っているオブジェクトへの参照だけのコピー。したがって、後でmyObjQuerymyObjの両方が同じオブジェクトを指しています。そのオブジェクトのプロパティを削除すると、両方の参照にその変更が反映されます。