Май 23

В 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 вместе со всеми его свойствами и методами.

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