深浅拷贝 - Javascript的-如何克隆一个对象?




深拷贝循环引用 (5)

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


很多关于如何复制对象及其属性的副本的建议,以及所有由其属性引用的对象的建议。 这是克隆对象而不复制它的一个版本,以便克隆继承后面添加的所有属性,除了那些被自己的属性克隆的属性:

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

您的行myObjTwo = myObjOne不克隆myObjOne ,它只是创建一个重复的引用到同一个对象!

实际的答案是使用一个克隆函数,也许从一个库,如underscore.js 。 但是,真的,看起来你有一些阅读和学习在Javascript中的对象和指针的概念。


简单。

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'


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





clone