Come si clona in profondità un oggetto Javascript?
So che ci sono varie funzioni basate su framework come JSON.parse(JSON.stringify(o))
e $.extend(true, {}, o)
ma non voglio usare un framework come quello.
Qual è il modo più elegante o efficiente per creare un clone profondo.
Ci preoccupiamo per casi limite come la clonazione di array. Non rompere le catene di prototipi, occuparsi dell'autoreferenzialità.
Non ci interessa supportare la copia di oggetti DOM e simili perché .cloneNode
esiste per questo motivo.
Poiché voglio principalmente utilizzare cloni profondi node.js
nell'utilizzo delle funzionalità ES5 del motore V8 è accettabile.
[Modificare]
Prima che qualcuno mi suggerisca di menzionare, c'è una netta differenza tra la creazione di una copia ereditando prototipicamente dall'oggetto e la clonazione . Il primo rovina la catena dei prototipi.
[Ulteriore modifica]
Dopo aver letto la tua risposta sono arrivato alla fastidiosa scoperta che la clonazione di interi oggetti è un gioco molto pericoloso e difficile. Prendiamo ad esempio il seguente oggetto basato sulla chiusura
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
Esiste un modo per scrivere una funzione clone che clona l'oggetto, ha lo stesso stato al momento della clonazione ma non può alterare lo stato di o
senza scrivere un parser JS in JS.
Non dovrebbe più esserci bisogno nel mondo reale di tale funzione. Questo è mero interesse accademico.
clone
funzione generica . L'oggetto in questione dovrebbe esporre il proprio clone
metodo su misura .