Как вы глубоко клонируете объект 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.
В такой функции больше не должно быть необходимости в реальном мире. Это просто академический интерес.