Для обработки круговых объектов, которые не могут обрабатывать JSON.stringify
, вы можете добавить библиотеку с именем JSOG , которая сериализует и десериализует произвольные графы в формат JSON.
var clone = JSOG.parse(JSOG.stringify(original));
Также было бы интересно попробовать залатать JSOG для клонирования с помощью этого трюка (на данный момент не хватает времени, но если кто-то захочет дать ему шанс ...):
Сериализация простой функции:
foo.f = function(a) { return a }
var stringForm = foo.f.toString() // "function (a) { return a }"
Десериализация функции:
eval("foo.f = " + stringForm)
Потребуются некоторые соглашения (вероятно, в названии свойства) для идентификации функций по сравнению с обычными строками (возможно, @func_f
).
Конечно, если функция вызывает вторую функцию, вторая функция должна существовать так же, как и для оригинала.
Вышеприведенное, однако, довольно опасно, если вы хотите принять сериализованную форму из ненадежного источника, но тогда принятие любой функции в любой форме из ненадежного источника будет опасным, поэтому, если вы заинтересованы в клонировании функций, доверие должно иметь уже установлено (или вы уже намереваетесь написать уязвимость в системе безопасности!).
Отказ от ответственности: Я не тестировал скорость JSOG stringify / parse против JSON stringify / parse, но он работает на простых (круговых) объектах, с которыми я его тестировал.