Mam dwie dobre odpowiedzi w zależności od tego, czy Twoim celem jest sklonowanie „zwykłego, starego obiektu JavaScript”, czy nie.
Załóżmy również, że Twoim celem jest utworzenie pełnego klonu bez odwołań do prototypu z powrotem do obiektu źródłowego. Jeśli nie jesteś zainteresowany pełnym klonowaniem, możesz użyć wielu procedur Object.clone () podanych w niektórych innych odpowiedziach (wzór Crockforda).
W przypadku zwykłych starych obiektów JavaScript wypróbowany i naprawdę dobry sposób klonowania obiektu we współczesnych środowiskach wykonawczych jest po prostu:
var clone = JSON.parse(JSON.stringify(obj));
Zauważ, że obiekt źródłowy musi być czystym obiektem JSON. Oznacza to, że wszystkie jego zagnieżdżone właściwości muszą być skalarami (takimi jak logiczna, łańcuch, tablica, obiekt itp.). Żadne funkcje ani obiekty specjalne, takie jak RegExp lub Date, nie będą klonowane.
Czy to jest wydajne? Pewnie, ze tak. Wypróbowaliśmy wszystkie metody klonowania i to działa najlepiej. Jestem pewien, że jakiś ninja wyczaruje szybszą metodę. Ale podejrzewam, że mówimy o marginalnych zyskach.
To podejście jest po prostu proste i łatwe do wdrożenia. Zapakuj go w wygodną funkcję, a jeśli naprawdę chcesz wycisnąć trochę korzyści, idź później.
Teraz w przypadku nieprzezroczystych obiektów JavaScript nie ma naprawdę prostej odpowiedzi. W rzeczywistości nie może być tak z powodu dynamicznej natury funkcji JavaScript i wewnętrznego stanu obiektu. Głębokie klonowanie struktury JSON z funkcjami wewnątrz wymaga odtworzenia tych funkcji i ich wewnętrznego kontekstu. A JavaScript po prostu nie ma znormalizowanego sposobu na zrobienie tego.
Prawidłowy sposób, aby to zrobić, jeszcze raz, polega na wygodnej metodzie, którą deklarujesz i używasz ponownie w swoim kodzie. Metodę wygody można wyposażyć w pewne zrozumienie własnych obiektów, aby zapewnić prawidłowe odtworzenie wykresu w nowym obiekcie.
Napisaliśmy własne, ale najlepsze ogólne podejście, jakie widziałem, jest tutaj:
http://davidwalsh.name/javascript-clone
To jest właściwy pomysł. Autor (David Walsh) skomentował klonowanie funkcji uogólnionych. Jest to coś, co możesz zrobić, w zależności od przypadku użycia.
Główną ideą jest to, że musisz specjalnie obsługiwać tworzenie instancji swoich funkcji (lub klas prototypowych, że tak powiem) dla poszczególnych typów. Tutaj podał kilka przykładów RegExp i Date.
Ten kod jest nie tylko krótki, ale także bardzo czytelny. Jest dość łatwy do rozszerzenia.
Czy to jest wydajne? Pewnie, ze tak. Biorąc pod uwagę, że celem jest stworzenie prawdziwego klonowania w głębokiej kopii, będziesz musiał przejść elementy wykresu obiektu źródłowego. Dzięki takiemu podejściu możesz dokładnie dostosować, które elementy podrzędne mają być traktowane i jak ręcznie obsługiwać typy niestandardowe.
Więc proszę bardzo. Dwa podejścia. Oba są moim zdaniem wydajne.