Jak głęboko sklonować obiekt Javascript?
Wiem, że istnieją różne funkcje oparte na frameworkach, takich jak JSON.parse(JSON.stringify(o))i, $.extend(true, {}, o)ale nie chcę używać takiego frameworka.
Jaki jest najbardziej elegancki lub skuteczny sposób na stworzenie głębokiego klonu.
Dbamy o skrajne przypadki, takie jak klonowanie tablic. Nie przerywanie łańcuchów prototypów, zajmowanie się odniesieniem do siebie
Nie zależy nam na wspieraniu kopiowania obiektów DOM i podobnych, ponieważ .cloneNodeistnieje z tego powodu.
Ponieważ chcę głównie używać głębokich klonów w node.jskorzystaniu z funkcji ES5 silnika V8, jest to dopuszczalne.
[Edytować]
Zanim ktoś zasugeruje, pozwólcie mi wspomnieć, że istnieje wyraźna różnica między tworzeniem kopii poprzez prototypowe dziedziczenie po obiekcie a jego klonowaniem . To pierwsze powoduje bałagan w łańcuchu prototypów.
[Dalsza edycja]
Po przeczytaniu Twojej odpowiedzi doszedłem do irytującego odkrycia, że klonowanie całych obiektów jest bardzo niebezpieczną i trudną grą. Weźmy na przykład następujący obiekt oparty na domknięciu
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
Czy istnieje sposób na napisanie funkcji klonującej, która klonuje obiekt, ma ten sam stan w momencie klonowania, ale nie może zmienić stanu obez pisania parsera JS w JS.
Taka funkcja nie powinna być już potrzebna. To tylko akademickie zainteresowanie.
clonefunkcji ogólnej . Przedmiotowy obiekt powinien eksponować własną, dostosowaną do potrzeb clonemetodę.