克隆一个JavaScript对象?

时间:2010-09-22 22:11:51

标签: javascript

  

可能重复:
  How to clone js object?

这是另一种创建javascript对象的方法(使用对象文字符号而不是函数):

user = {
  name: "Foo",
  email: "bar@baz.com"
}

有没有办法克隆这个对象还是单身?

5 个答案:

答案 0 :(得分:29)

试试这个:

var clone = (function(){ 
  return function (obj) { Clone.prototype=obj; return new Clone() };
  function Clone(){}
}());

这是发生了什么。

  • 克隆是一个虚拟构造函数。
  • 我们将要克隆的对象分配给Clone构造函数的原型。
  • 我们使用'new'调用Clone,因此构造的对象将原始对象作为其构造函数的原型(非标准)__proto__

克隆的对象将共享原始对象的所有属性,而不会复制任何内容。如果为克隆对象的属性分配了新值,则它们不会干扰原始对象。并且不需要篡改内置插件。

请记住,新创建的对象的对象属性将引用与克隆对象的同名属性相同的对象。为克隆的属性分配新值不会干扰原始属性,但会为克隆的对象属性赋值。


在chrome或firebug控制台中尝试此操作:

var user = {
  name: "Foo",
  email: "bar@baz.com"
}

var clonedUser = clone(user);

console.dir(clonedUser);

可以找到有关此克隆技术的详细说明here

答案 1 :(得分:11)

您可以使用JSON对象(存在于现代浏览器中):

var user = {name: "Foo", email: "bar@baz.com" } 
var user2 = JSON.parse(JSON.stringify(user))

user2.name = "Bar";
alert(user.name + " " + user2.name); // Foo Bar

jsfiddle


修改

如果您需要在旧版浏览器中使用此功能,请参阅http://www.json.org/js.html

答案 2 :(得分:4)

我喜欢用这个:

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        var F = function () {};
        F.prototype = o;
    return new F();
    };
}

然后我要克隆的任何对象都可以完成:

user = {
    name: "Foo",
    email: "bar@baz.com"
};
var user2 = Object.create(user);

如(或类似)JavaScript The Good Parts

所示

答案 3 :(得分:2)

大多数javascript框架都支持对象克隆。

var a= {'key':'value'};
var b= jQuery.extend( true, {}, a );

答案 4 :(得分:0)

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: "bar@baz.com"
   , 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);