Парадоксальная ситуация Javascript объектно ориентированный язык программирование, но в нем нет встроенных механизмов для клонирования объектов. Чехарда с передачей ссылок на объекты "деревенским" присваиванием всеже не всегда нужна.
Когда мне понадобился рабочий код для копирования объектов, то я довольно быстро нашел по блогам готовые решения.
Но в дальнейшем, под действием ряда факторов его пришлось модифицировать.
Поэтому представляю свой метод-функцию копирования объектов java-script:
// notUseRecursion - опция копирования свойств объекта без использования рекурсии (сохраняются ссылки). // Полное копирование объекта события в IE это его смерть от выхода за пределы памяти. // Поэтому есть смысл его отключить function clone(o,notUseRecursion) {// Out of the memory in IE8 if(!o || 'object' !== typeof o) return o; var c = 'function' === typeof o.pop ? [] : {}, p, v; for(p in o) { //if(o.hasOwnProperty(p)) {// Dont supported in IE8 if (Object.prototype.hasOwnProperty.call(o,p)){ v = o[p]; c[p] = (v && 'object' === typeof v && !notUseRecursion)?clone(v):v; } } return c; }
Основные особенности, которые пришлось учесть в коде функции клонирования - это перлы Internet Explorer 6-8:
1) Свойство объекта hasOwnProperty() не поддерживается, в место него происходит применение одноименной функции прототипа объекта Object (см. код).
2) Рекурсивное копирование объекта события (window.event к примеру) - приводило к остановке выполнения скрипта от "out of the memory". Объект события содержит методы "нативного кода" (Native code) который лучше не копировать, а сохранять ссылки на них. Поэтому есть смысл скопировать объект без использования рекурсии (notUseRecursion=yes).
Если найду еще какие-нибудь препятствия на пути свободного копирования объектов, обязательно опубликую их в блоге...
Комментариев нет:
Отправить комментарий