Клонирование объекта JavaScript?
Возможный дубликат:
Как клонировать js-объект?
Это еще один способ создания объекта javascript (с использованием объектной нотации вместо функции):
user = {
name: "Foo",
email: "[email protected]"
}
Есть ли способ клонировать этот объект или он является одиночным?
Ответы
Ответ 1
Попробуйте следующее:
var clone = (function(){
return function (obj) { Clone.prototype=obj; return new Clone() };
function Clone(){}
}());
Вот что происходит.
- Клон - это конструктор фиктивного типа.
- Мы назначаем объект, который хотим клонировать к прототипу конструктора Clone.
- Мы называем Clone с использованием "new", поэтому построенный объект имеет исходный объект в качестве своего прототипа конструктора aka (нестандартный)
__proto__
.
Клонированный объект будет делить все свойства исходного объекта без каких-либо копий чего-либо. Если свойствам клонированного объекта присваиваются новые значения, они не будут мешать исходному объекту. И никаких вмешательств в встроенные модули не требуется.
Имейте в виду, что свойство объекта вновь созданного объекта будет ссылаться на тот же объект, что и одноименное свойство клонированного объекта. Назначение нового значения для свойства клона не будет мешать оригиналу, но присвоение значений свойствам объекта clone будет.
Попробуйте это в консоли Chrome или Firebug:
var user = {
name: "Foo",
email: "[email protected]"
}
var clonedUser = clone(user);
console.dir(clonedUser);
Подробное объяснение этой методики клонирования можно найти здесь.
Ответ 2
Вы можете использовать объект JSON (присутствует в современных браузерах):
var user = {name: "Foo", email: "[email protected]" }
var user2 = JSON.parse(JSON.stringify(user))
user2.name = "Bar";
alert(user.name + " " + user2.name); // Foo Bar
Смотрите jsfiddle.
ИЗМЕНИТЬ
Если вам это нужно в старых браузерах, см. http://www.json.org/js.html.
Ответ 3
Мне нравится использовать это:
if (typeof Object.create !== 'function') {
Object.create = function (o) {
var F = function () {};
F.prototype = o;
return new F();
};
}
то любой объект, который я хочу клонировать, может быть выполнен как:
user = {
name: "Foo",
email: "[email protected]"
};
var user2 = Object.create(user);
Как показано в (или аналогичном) JavaScript Хорошие части
Ответ 4
Большинство фреймворков javascript имеют хорошую поддержку клонирования объектов.
var a= {'key':'value'};
var b= jQuery.extend( true, {}, a );
Ответ 5
Object.prototype.clone = function clone(obj) {
obj = obj || this;
var new_obj = {};
for( var p in obj ) {
if ( obj.hasOwnProperty(p) ) {
if( obj[p] !== null && typeof(obj[p]) === "object" ) {
new_obj[p] = clone( obj[p] );
}
else {
new_obj[p] = obj[p];
}
}
}
return new_obj;
};
/* Example */
var foo = {
name: "Foo"
, email: "[email protected]"
, obj: {a:"A",b:"B"}
};
var bar = foo.clone();
bar.name = "Bar";
bar.obj.b = "C";
// foo and bar should have a different 'name'
// foo and bar should retain the same email
// foo and bar should have different values for <foo/bar>['obj']['b']
// foo and bar should have the same values for <foo/bar>['obj']['a']
console.dir(foo);
console.dir(bar);