Как вы глубоко клонируете объект Javascript?
Я знаю, что существуют различные функции на основе таких фреймворков, как JSON.parse(JSON.stringify(o))
и $.extend(true, {}, o)
, но я не хочу использовать такую фреймворк.
Каков самый элегантный или эффективный способ создания глубокого клона.
Мы заботимся о таких случаях, как клонирование массива. Не нарушать цепи прототипов, имея дело с самостоятельной ссылкой.
Мы не заботимся о поддержке копирования объектов DOM и, например, потому что .cloneNode
существует по этой причине.
В основном я хочу использовать глубокие клоны в node.js
, используя возможности ES5 для двигателя V8.
[изменить]
Прежде, чем кто-нибудь предложит, позвольте мне упомянуть, что существует отличная разница между созданием копии путем прототипного наследования с объекта и клонирования. Первый делает беспорядок цепи прототипов.
[Дальнейшее редактирование]
После прочтения вашего ответа я пришел к раздражающему открытию, что клонирование целых объектов - очень опасная и трудная игра. Возьмем, к примеру, следующий объект, основанный на закрытии
var o = (function() {
var magic = 42;
var magicContainer = function() {
this.get = function() { return magic; };
this.set = function(i) { magic = i; };
}
return new magicContainer;
}());
var n = clone(o); // how to implement clone to support closures
Есть ли способ написать функцию клонирования, которая клонирует объект, имеет такое же состояние во время клонирования, но не может изменить состояние o
без написания JS-парсера в JS.
Больше не должно быть необходимости в реальной жизни для такой функции. Это просто академический интерес.