Вопрос по jquery, javascript – Почему jQuery Extend Deep Copy не рекурсивно копирует объект?

9

Я искал повсюду и нашел похожие вопросы с ответами, которые действительно не решали мою проблему, поэтому я извиняюсь, если это кажется повторением, но из моих экспериментов стало ясно, что функция глубокого копирования jQuery на самом деле не работает так, как она работает. описано (или, возможно, я неправильно понял его описание).

Вот пример, демонстрирующий проблему, с которой я сталкиваюсь: http://jsfiddle.net/wcYsH/

Или это для скачивания: https://github.com/kevroy314/jQuery-Extend-Test

Почему данные в предыдущей копии изменяются при манипуляциях с глубокой копией?

Недавно на форумах jQuery была тема об этом. Я думаю, что ваш вариант использования выходит за рамки цели метода $ .extend.forum.jquery.com/topic/… Kevin B
Так рада, что я не схожу с ума!jQuery .clone было то, что я исследовал изначально, но я виделthisError: User Rate Limit Exceeded user986122
Вот связанный билет ошибкиbugs.jquery.com/ticket/10014 Kevin B
Error: User Rate Limit ExceededjQuery& APOS; s.clone вместо? Explosion Pills
Обновление: похоже, что .clone не будет клонировать мой тип объекта. Только объекты DOM. Я думаю, что лучшее решение сейчас - написать функцию клонирования для каждого из моих объектов и позволить им самостоятельно выполнять самовоспроизведение. user986122

Ваш Ответ

1   ответ
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))

должен оценить, чтобыtrueError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Теперь в isPlainObject кажется, что эти строки должны быть оценены. (где есть hasOwnhasOwn = 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;
    }

И там, где он приходит к выводу, что это не «обычный объект».

Это имеет смысл, когда вы рассматриваете объекты с конструкторомprobably ought to be created via that constructorError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded user986122

Похожие вопросы