创建一个新对象,而不是引用

这个问题在这里已经有了答案:

  • 在JavaScript中深入克隆对象的最有效方法是什么? 57个答案
  • 我如何正确克隆一个JavaScript对象? 54个答案

  • 最简单的版本是使用JSON.parse/stringify ,最快的就是使用一个普通的克隆方法:

    /* simplest */
    var clone = JSON.parse(JSON.stringify(obj));
    
    /* fastest */
    function clone(obj) {
        if (obj == null ||typeof obj != "object") return obj;
        var copy = obj.constructor();
        for (var attr in obj) {
            if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
        }
        return copy;
    }
    var clone2 = clone(obj);
    

    您可以编写一个深层克隆方法,将您的对象的每个属性的每个值都复制到一个新的方法中。

    请注意,我扩展了Object.prototype以避免类型检查,为了简单起见,如果您觉得不太合适,可以更改它

    Object.defineProperty(Object.prototype, "clone", {
        enumerable : false,
        value: function(deep) {
        deep |= 0;      
        var type = typeof this;
        if (type !== "object") {
            return this.valueOf();
        }
    
        var clone = {};
        if (0 === deep) {
            for (var prop in this) {
                clone[prop] = this[prop];
            }
        } else {
            for (var prop in this) {
                if ( typeof this[prop] !== "undefined" && this[prop] !== null)
                    clone[prop] = ( typeof this[prop] !== "object" ? this[prop] : this[prop].clone(deep - 1));
                else
                    clone[prop] = "";
            }
        }
        return clone;
      }
    });
    
    Object.defineProperty(Array.prototype, "clone", {
        enumerable : false,
        value:function(deep) {
        deep |= 0;
        var clone = [];
            if (0 === deep)
                clone = this.concat();
            else
                this.forEach(function(e) {
                    if ( typeof e !== "undefined" && e !== null)
                        clone.push(( typeof e !== "object" ? e : e.clone(deep - 1)));
                    else
                        clone.push("");
                });
        return clone;
      }
    });
    

    示例输出和一个Demo

    var first = {
      var1:0,
      var2:0
      var3:0
    };
    var second = first.clone(Infinity);
    first.var1++;
    console.log (first.var1,second.var1,second); //1 , 0
    

    要将其应用于您的代码,您只需克隆Object app.Defaults = app.Variables.clone()

    第一个论点是深度水平。 如果省略,则只克隆第一级,在这种情况下就足够了。

    链接地址: http://www.djcxy.com/p/6957.html

    上一篇: Creating a new object, not a reference

    下一篇: TypeError: object is not a function at new <anonymous>