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

Клонирование объекта JavaScript?

Возможный дубликат:
Как клонировать js-объект?

Это еще один способ создания объекта javascript (с использованием объектной нотации вместо функции):

user = {
  name: "Foo",
  email: "[email protected]"
}

Есть ли способ клонировать этот объект или он является одиночным?

4b9b3361

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