9

私はどこでも検索し、私の問題に実際には対処していない回答を含む同様の質問を見つけたので、これが繰り返しのように思われる場合はお詫びしますが、私の実験から、jQuery のディープ コピー機能は説明どおりに実際には機能しないようです (または多分私はその説明を誤解しています)。

私が抱えている問題を示す例を次に示します: http://jsfiddle.net/wcYsH/

またはダウンロード用: https://github.com/kevroy314/jQuery-Extend-Test

ディープ コピーが操作されると、前のコピーのデータが変更されるのはなぜですか?

4

1 に答える 1

5

1 つは、通常のオブジェクトを作成していないことです。

拡張用の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ディープ コピーを行うには to を評価する必要があります。copy は、コピーされている現在のオブジェクトの一部にすぎません。

しかし、「プレーンな」オブジェクトを作成していません。new 演算子を使用してコンストラクターを呼び出して生成されたオブジェクトを作成しています。

現在、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」ではないと結論付けているところがあります。

これは、コンストラクターを持つオブジェクトがおそらくそのコンストラクターを介して作成されるか、他の言語/フレームワークで見られるように少なくとも何らかの「クローン」メソッドを使用する必要があると考える場合に理にかなっています。

于 2012-05-08T23:51:17.120 に答える