В javascript объекты передаются и копируются по ссылке. Рассмотрим пример:
var obj = { number: 1 };
// Копируем объект
var copy = obj;
copy.number = 777;
alert(obj.number);
В результате выполнения данного кода на экран будет выведено число 777 (а не 1 как ожидалось). Переменные obj и copy - одна и та же ссылка.
Как передать объект по значению? Нам нужна функция clone.
Я пробовал множество функций, но в них было много недостатков (не копировались методы объекта, или массивы). В итоге нашлась хорошая реализация (из фреймворка ExtJS). Я немного подправил эту функцию, вот результат:
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 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 вместе со всеми его свойствами и методами.
Пользуйтесь на здоровье :)
