创建新对象,而不是引用
Creating a new object, not a reference
这是我第一次来这里。
所以问题是,我有一个包含所有变量的对象,如下所示:
app.Variables = {
var1: 0,
var2: 0,
var3: 0
}
我想把这些值存储在一个名为Defaults的对象中,如下所示:
app.Defaults = app.Variables
但现在的问题是,在我的代码中,应用程序。变量.var1,例如如下递增:
app.Variables.var1++
这意味着,那个应用程序。Defaults.var1的增量也等于app。变量.var1.
我在这里该怎么办?
最简单的版本是使用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的每个属性的每个值复制到一个新的值。
注意,我扩展了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;
}
});
示例输出和演示
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()
第一个论点是深度的水平。如果省略,则只克隆第一个级别,在这种情况下这就足够了
相关文章:
- 如何使用object.assign()从其他对象引用基本对象属性
- 查找关键字并创建新对象
- 创建新对象时,为什么要更新旧对象
- 为什么要使用立即调用的函数来创建新对象
- 剑道网格-插入具有外部列的新对象失败
- 将原型调用为新对象中的另一个原型
- 将新对象添加到本地存储
- $$hashKey在Angular中push()新对象时未生成新值
- 从分析类传递现有对象,否则创建一个新对象
- 如何从onclick字符串中引用javascript对象函数
- 在jquery事件中引用javascript对象
- 为什么可以't在创建新对象时引用旧对象
- 在Javascript中使用新的引用创建一个新对象 - 不要复制或克隆 -
- 同步代码框 - 调用 API - 解析 JSON - 获取引用 - 保存新对象
- JavaScript Scope:引用任意新对象的计时器
- JavaScript 的这个对象是否以我认为的方式引用新创建的对象
- 为什么要求始终返回具有新内部引用的新对象
- 创建新对象,而不是引用
- 赋值一个新对象并保持引用
- 将对象属性复制到新对象属性 - 而不是通过引用