Snowcore’s блог » Blog Archive » Clone Javascript object

Clone Javascript object

В javascript объекты передаются и копируются по ссылке. Рассмотрим пример:

// Создаем объект с единственным полем number
var obj = { number: 1 };

// Копируем объект
var copy = obj;
copy.number = 777;

alert(obj.number);

В результате выполнения данного кода на экран будет выведено число 777 (а не 1 как ожидалось). Переменные obj и copy - одна и та же ссылка.

Как передать объект по значению? Нам нужна функция clone.

Я пробовал множество функций, но в них было много недостатков (не копировались методы объекта, или массивы). В итоге нашлась хорошая реализация (из фреймворка ExtJS). Я немного подправил эту функцию, вот результат:

function clone(o) {
 if(!o || ‘object’ !== typeof o)  {
   return o;
 }
 varc = ‘function’ === typeof o.pop ? [] : {};
 var p, v;
 for(p in o) {
 if(o.hasOwnProperty(p)) {
  v = o[p];
  if(v && ‘object’ === typeof v) {
    c[p] = clone(v);
  }
  else {
    c[p] = v;
  }
 }
}
 return c;
}

Проверяем действие функции:

var o = { a:1, get:function(){ alert(this.arr[1]);}, arr: [1,2,3] };
var c = clone(o); // делаем клон объекта

c.arr[0] = 77;
c.arr[1] = 88;
c.arr[2] = 99;

// Значения остались прежними
alert(o.arr[0]); // 1
alert(o.arr[1]); // 2
alert(o.arr[2]); // 3

// Методы тоже были скопированы
c.get(); // 88
o.get(); // 2

Как видно из примера, функция clone скопировала объект o вместе со всеми его свойствами и методами.

Пользуйтесь на здоровье :)

7 Responses

  1. Cidor Says:

    Согласен. Так удобнее.

  2. evol1980 Says:

    gde to ja yze eto chital.

  3. admin Says:

    @ evol1980:

    Мой блог - это, в первую очередь ресурс для меня, и размещать чужие статьи здесь я не собираюсь.

  4. Фанат Says:

    Я вам очень благодарен, мне понравилось.

  5. evol1980 Says:

    oj sorri oshibsa

  6. evol1980 Says:

    opat vernylsa na etot sajt ctob skazat spasibo :)

  7. Octane Says:

    На самом деле, ситуаций, когда нужна одна лишь функция «clone(…)», практически не бывает. В реальных проектах обычно есть функция «extent», а на её основе строят функцию «clone».
    function extend(obj, hash) {
    for(var key in hash)
    if(hash.hasOwnProperty(key))
    obj[key] = hash[key];
    }

    function clone(obj) {
    return extend({}, obj);
    }
    То есть для копирование объекта, создаётся новый объект и расширяется методами и атрибутами переданного.

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

Внимание: Комментарии проходят ручную модерацию