【问题标题】:Creating a new object, not a reference [duplicate]创建一个新对象,而不是引用[重复]
【发布时间】:2013-07-06 20:49:51
【问题描述】:

这是我第一次来这里。

所以问题是,我有一个包含所有变量的对象,如下所示:

app.Variables = {
    var1: 0,
    var2: 0,
    var3: 0
}

我想将这些值存储在一个名为 Defaults 的对象中,如下所示:

app.Defaults = app.Variables

但现在的问题是,在我的代码中,app.Variables.var1 例如像这样递增:

app.Variables.var1++

这意味着,app.Defaults.var1 的增量也等于 app.Variables.var1。

我该怎么办?

【问题讨论】:

标签: javascript


【解决方案1】:

最简单的版本是使用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);

【讨论】:

  • @flav yah,感谢您指出这一点。
  • 感谢所有答案 :) 我使用了最简单的版本,它可以工作 :) 稍后在我的代码中,对象以相同的方式克隆回来
【解决方案2】:

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

注意我扩展了 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()

第一个参数是深度级别。如果省略,则仅克隆第一级,在这种情况下就足够了。

【讨论】:

    猜你喜欢
    • 2017-04-12
    • 2017-04-23
    • 2017-02-25
    • 1970-01-01
    • 2015-07-26
    • 2019-03-12
    • 1970-01-01
    • 2012-07-15
    相关资源
    最近更新 更多