10 января 2012 г.

Клонирование объектов Java-script


Парадоксальная ситуация 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).
Если найду еще какие-нибудь препятствия на пути свободного копирования объектов, обязательно опубликую их в блоге...

Комментариев нет:

Отправить комментарий