Копия обьекта в JavaScript
От: rgl  
Дата: 04.01.03 07:57
Оценка:
Такой вот вопрос — можно ли и как создать копию обьекта

var o1 = new Object;

o1.a = 1;
o1.b = 2;

var o2 = o1;

o2.a=9;


После этого o1.a тоже становится 9, т.е. o1 и o2 — разные имена одного и того же обьекта. А как создать именно копию, чтобы всякие изменения ее не влияли на оригинал? Есть вот такой способ:

var o2 = new Object;
var i;
for( i in o1 )
  o2[i] = o1[i];


но так не всегда все свойства копируются. Есть ли более правильный способ?
Re: Копия обьекта в JavaScript
От: DSD Россия http://911.ru/cv
Дата: 04.01.03 14:40
Оценка:
Здравствуйте, rgl, Вы писали:

rgl>Такой вот вопрос — можно ли и как создать копию обьекта


rgl>
rgl>var o1 = new Object;

rgl>o1.a = 1;
rgl>o1.b = 2;

rgl>var o2 = o1;

rgl>o2.a=9;
rgl>


rgl>После этого o1.a тоже становится 9, т.е. o1 и o2 — разные имена одного и того же обьекта. А как создать именно копию, чтобы всякие изменения ее не влияли на оригинал? Есть вот такой способ:


rgl>
rgl>var o2 = new Object;
rgl>var i;
rgl>for( i in o1 )
rgl>  o2[i] = o1[i];
rgl>


rgl>но так не всегда все свойства копируются. Есть ли более правильный способ?


А ты создай такой конструктор:

function MyObject(_obj) {
   this.propArray = new Array(); 
   this.propArrayIndex = 0; 
   this.funcArray = new Array(); 
   this.funcArrayIndex = 0; 
   this.addProperty = function (_name, _value) {
             this[_name] = _value;
             this.propArray[this.propArrayIndex++] = _name;
   }
   this.addFunc = function (_name, _body) {
             eval("this."+_name+" = "+_body);
             this.funcArray[this.funcArrayIndex++] = _name;
   }
   
   if (_obj) {
      if (_obj['propArray'] && _obj['propArrayIndex']) 
          for (var i=0; i<=_obj.propArrayIndex; i++) this.addProperty(_obj.propArray[i], _obj[_obj.propArray[i]]);
      if (_obj['funcArray'] && _obj['funcArrayIndex']) 
          for (var i=0; i<=_obj.funcArrayIndex; i++) this.addFunc(_obj.funcArray[i], _obj[_obj.funcArray[i]]);
   }
   return this;
}


Тогда, если твой код чуток переделать, то он будет выглядеть так:
var o1 = new MyObject;

o1.addProperty("a",1);
o1.addProperty("b",2);
o1.addFunc("Test", function(_Arg) { with (this) {
  alert(_Arg);
  return _Arg;
}} );

var o2 = new MyObject(o1);

o2.a=9;

o2.Test(o2.a);
o2.Test(o1.a);


Вся фишка в строке var o2 = new MyObject(o1);. Если в конструктор MyObject передать параметром обьект исходник, то все его свойства и методы скопируются в новый обьект.
--
DSD
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.