Подтвердить что ты не робот

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

4b9b3361

Ответ 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'