Javascript - Как клонировать объект?
Я смущен. Я создаю копию из myObjOne
, чем я удаляю запись из myObjOne
и JS удаляет запись в моей копии (myObjTwo
) тоже? Но почему?
myObjOne = {};
myObjOne['name'] = 'xxx';
myObjOne['id'] = 'yyy';
myObjOne['plz'] = 'zzz';
// clone
myObjTwo = myObjOne;
// remove something
delete myObjOne['name'];
console.dir(myObjTwo);
Пример
http://jsbin.com/itixes/edit#javascript,html
Ответы
Ответ 1
Обновление: удаление Object.create
в качестве метода клонирования, как указано в комментариях.
myObjTwo = myObjOne;
не клонирует. Он просто копирует ссылку.
Если вы хотите клонировать, вы можете использовать JSON.parse
и JSON.stringify
var x = {a:{b:{c:{'d':'e'}}}};
var y = JSON.parse(JSON.stringify(x)); //y is a clone of x
console.log(y.a.b.c.d); //prints e
console.log(y === x); //prints false
Предупреждение: Как упоминал Рейнос в комментариях, этот клон на основе JSON не сохраняет методы входного объекта в выходном объекте. Это решение достаточно хорошо, если ваш объект не содержит никаких методов. Методы - это свойства объекта, которые являются функциями. Если var obj = {add : function(a,b){return a+b;}}
, то add
является методом obj
.
Если вам нужно решение, поддерживающее копирование методов, затем перейдите к этим SO-ответам (как указывает мусефан, Мэтт и Ранхиру Курай)
Я предлагаю Как правильно клонировать объект JavaScript?
Ответ 2
Вы можете использовать jQuery так:
var myObjTwo = jQuery.extend(true, {}, myObjOne);
Первый аргумент указывает, что мы хотим сделать глубокую копию myObjOne
.
Ответ 3
Это не то, как вы клонируете, а просто сохраняете один и тот же исходный объект во дополнительной переменной. Возможно, этот ответ поможет вам
Ответ 4
Много советов о том, как сделать копию не только объекта и его свойств, но и всех объектов, на которые ссылаются его свойства. Здесь версия, которая клонирует объект, не копируя его, и чтобы клон наследовал все свойства, добавленные позже, кроме тех, которые были затенены собственными свойствами клона:
var cloneOf = (function() {
function F(){}
return function(o) {
F.prototype = o;
return new F();
}
}());
Некоторые могут распознать шаблон. Пример:
var base = {foo:'foo', bar:'bar'};
var baseClone = cloneOf(base);
alert(baseClone.foo); // foo
Ответ 5
Ваша строка myObjTwo = myObjOne
не клонирует myObjOne
, она просто создает дубликат ссылки на тот же объект!
Фактический ответ заключается в использовании функции клона, возможно, из библиотеки, такой как underscore.js. Но на самом деле, похоже, что у вас есть кое-какие знания и знания, связанные с концепцией объектов и указателей в Javascript.
Ответ 6
Simple.
var clone=function(o){
var n= {}.toString.apply(o)=="[object Array]" ? []:{};
for(i in o)
n[i]= typeof o[i]=='object' ? clone(o[i]):o[i];
return n;
};
Использование:
var x={a:{d:34},b:33};
var y=clone(x); // clones 'x'
Ответ 7
Вы можете использовать Object.assign()
, но помните о поддержке браузера.
Дополнительная информация здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign.
Пример:
myObjTwo = Object.assign({}, myObjOne);