jsFiddle here.jquery.extend (true, [], obj), не создавая глубокую копию
Если сработало глубокое копирование, выход будет «Любопытный Джордж», а не «Игра Эндера». Как я могу сделать глубокую копию? Ответ на this question указывает, что $.extend(true, [], obj)
создает глубокую копию. Однако мой пример показывает, что это не так.
function Person(){}
Person.prototype.favorite_books = [];
var george = new Person();
george.favorite_books = ["Curious George"];
var kate = new Person();
kate.favorite_books = ["The Da Vinci Code", "Harry Potter"];
var people = [kate, george];
var people_copy = $.extend(true, [], people);
people_copy[0].favorite_books[0] = "Ender's Game";
$('#text').text(people[0].favorite_books[0]);
РЕШЕНИЕ
Я обновил jsFiddle. Оказывается, мне нужно глубоко скопировать каждый объект в массиве отдельно , если объект является настраиваемым объектом (то есть $.isPlainObject
возвращает false).
использование .clone() см. Http://api.jquery.com/clone/ –
@Paul Sullivan: '.clone()' должен использоваться с объектами DOM – zerkms
в порядке, поэтому просмотрите .extend исходный код и посмотрите, почему рекурсивная функция не копирует атрибуты –