2012-05-08 9 views
9

私はどこからでも検索しましたが、私の問題に実際には触れていない回答で同様の質問を見つけましたので、お詫び申し上げますが、これは繰り返しですが、jQueryのディープコピー機能は実際には記述されていない(または私はその説明を誤解している)。 ダウンロードするhttp://jsfiddle.net/wcYsH/なぜjQuery Extend Deep Copyはオブジェクトを再帰的にコピーしないのですか?

それともこれを:: https://github.com/kevroy314/jQuery-Extend-Test

深いコピーが操作される前のコピー内のデータは変更を取得しないのはなぜここ

は私がいる問題を実証する例を示しますか?

+1

代わりに 'jQuery'の' .clone'を使用しますか? –

+1

これについてのスレッドはjQueryフォーラムにありました最近私はあなたのユースケースが$の目的の外にあると思う。 thod。 https://forum.jquery.com/topic/deep-copies-using-extend-on-object-instances –

+1

ここに関連するバグチケットhttp://bugs.jquery.com/ticket/10014 –

答えて

5

通常のオブジェクトは作成していません。

私は、拡張のためのjQuery 1.7.2のソースコードを見ています。

https://github.com/jquery/jquery/blob/master/src/core.js

は、私はラインを気づい:

if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) 

は深いコピーを行うためにtrueに評価することがあります。コピーは現在コピーされているオブジェクトの一部に過ぎません。

しかし、 "普通の"オブジェクトを作成しているわけではありません。新しい演算子でコンストラクタを呼び出すことによって生成されたオブジェクトを作成しています。

今、isPlainObjectでは、これらの行を評価する必要があるようです。 (hasOwnがhasOwn = Object.prototype.hasOwnProperty

try { 
     // Not own constructor property must be Object 
     if (obj.constructor && 
      !hasOwn.call(obj, "constructor") && 
      !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) { 
      return false; 
     } 
    } catch (e) { 
     // IE8,9 Will throw exceptions on certain host objects #9897 
     return false; 
    } 

であり、それは、それは「plainObject」ではありません結論ところがあります場所。あなたは、コンストラクタを持つオブジェクトは、おそらくそのコンストラクタを介して、またはで作成されるべきで考えると

これは理にかなっています

+1

ありがとうございます!それは私が探していた説明です。私は先に行って、私が作成したオブジェクトごとに.clone関数を書いた。残念ながら、私が使っていたhackyの方法は、アプリケーションがうまくいくほど深いオブジェクトをコピーしていましたが、メモリを浪費しない程度に浅いので、私の実装は恐ろしいメモリでした!ふりだしに戻る! – user986122

関連する問題