Такой вот вопрос — можно ли и как создать копию обьекта
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];
но так не всегда все свойства копируются. Есть ли более правильный способ?
Здравствуйте, 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 передать параметром обьект исходник, то все его свойства и методы скопируются в новый обьект.