【问题标题】:Cloning the object in JavaScript [duplicate]在 JavaScript 中克隆对象 [重复]
【发布时间】:2014-01-11 09:26:40
【问题描述】:

您好,我已使用以下代码创建对象

var parent = {};
parent["Task name"] = "Task " + ++x;
parent["Start time"] = "01/03/2013";
parent["End time"] = "01/08/2013";
parent["Duration"] = "5 days";
parent["Status"] = Math.round(Math.random() * 100);

如何使用 JavaScript 代码克隆/获取对象的副本。有没有其他方法可以做到这一点?

【问题讨论】:

    标签: javascript html clone


    【解决方案1】:

    克隆对象的最简单方法是使用以下函数:

    function clone(a){var b=function(){};b.prototype=a;return new b;}
    

    这会创建对象的基本副本,但请注意,这不会创建深层副本,只会创建浅层副本。

    【讨论】:

    • @wared 如果你得到一个 typeError 那么输入'a'显然不是一个有效的对象,或者你试图传入一个本地对象(或根本没有对象),因此你应该期待失败,因为它的设计目的是只处理 javascript 对象而不是别的。
    • @wared 我修复了它(b 没有被转换为函数),原始代码直接来自我已经缩小的脚本之一,缩小时可能出了问题。
    • @wared 该脚本正在使用中,所以应该没有任何问题,但检查后发现使用它的代码还不需要克隆方法,所以错误被忽略了。
    • @wared 当然,克隆在更改之前不会拥有这些属性,它的原型是如何工作的,它为什么是shallow 克隆,它模仿a 的属性,除非这些属性在b 上是明确设置的。不管你怎么想,这是克隆对象最经济有效的方法,并且与任何其他方法不同,它没有递归循环的风险。当然,除非你有新的 Object.create 可用,即使这样也远非完美。克隆一个 javascript 对象非常困难,而且不可能既正确又快速地完成。
    • 确实,您不应该使用原型来克隆对象。这与深拷贝或浅拷贝无关,这称为继承,是完全不同的主题。
    【解决方案2】:

    用 jQuery 试试这个:

    var parent = {};
                    parent["Task name"] = "Task " + ++x;
                    parent["Start time"] = "01/03/2013";
                    parent["End time"] = "01/08/2013";
                    parent["Duration"] = "5 days";
                    parent["Status"] = Math.round(Math.random() * 100);
    var newObj = jQuery.extend(true, {}, parent);
    

    【讨论】:

      【解决方案3】:

      最基本的方法如下:

      var clone = {};
      for (var k in parent) {
          clone[k] = parent[k];
      }
      

      在这种情况下有效,因为所有值都是原始类型。

      【讨论】:

        猜你喜欢
        • 2014-07-08
        • 1970-01-01
        • 2011-07-18
        • 2017-06-13
        • 2013-01-03
        • 1970-01-01
        • 2012-09-23
        • 2012-04-01
        相关资源
        最近更新 更多