Javascript - 如何克隆对象?

时间:2011-11-01 11:35:29

标签: javascript copy clone

我很困惑。我从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

8 个答案:

答案 0 :(得分:23)

更新:删除Object.create作为克隆方法,如评论中所示。

  myObjTwo = myObjOne;

没有克隆。它只是复制参考。

如果您想要克隆,可以使用JSON.parseJSON.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

警告:正如Raynos在评论中提到的,这个基于JSON的克隆不保留输出对象中输入对象的方法。如果您的对象不包含任何方法,此解决方案就足够了。方法是作为函数的对象的属性。如果var obj = {add : function(a,b){return a+b;}}那么addobj的方法。

如果您需要一个支持复制方法的解决方案,那么请仔细阅读这些SO答案(如musefan,Matt和Ranhiru Cooray所指出的那样)

我建议How do I correctly clone a JavaScript object?

答案 1 :(得分:16)

您可以像这样使用jQuery:

var myObjTwo = jQuery.extend(true, {}, myObjOne);

第一个参数表明我们想要制作myObjOne的深层副本。

答案 2 :(得分:3)

这不是你克隆的方式,只是将相同的原始对象存储在一个额外的变量中。也许this answer会帮助你

答案 3 :(得分:2)

关于如何不仅复制对象及其属性,而且复制其属性引用的所有对象的大量建议。这是一个克隆对象而不复制它的版本,因此克隆继承了以后添加的所有属性,除了那些被克隆自己的属性遮蔽的属性:

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

答案 4 :(得分:1)

您可以使用Object.assign()但请注意浏览器支持。

此处有更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

示例:

myObjTwo = Object.assign({}, myObjOne);

答案 5 :(得分:0)

您的第myObjTwo = myObjOne行未克隆myObjOne,它只是创建了对同一对象的重复引用!

实际答案是使用克隆函数,可能来自underscore.js等库。但实际上,看起来你有一些阅读和学习如何在Javascript中对象和指针的概念。

答案 6 :(得分:0)

简单。

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 :(得分:0)

使用ES6,使用扩展运算符。

myObjTwo = {...myObjOne}

es6中的spread运算符只是省略号。 即使原件被销毁,它也会创建原件的副本