我有两个相同类型的对象,我想将其中一个对象的内容复制到另一个对象。
const Invoice1 = new InvoiceModel();
const Invoice2 = new InvoiceModel();
现在,为了得到如下内容: Invoice2 = Invoice1
阅读后:
How do I correctly clone a JavaScript object?
我尝试使用下面的任何一个命令,但所有命令都显示invoice2未在运行时定义:
Invoice2 = { ...Invoice1 }; //OR
Invoice2 = Object.assign({}, Invoice1); //OR
Invoice2 = JSON.parse(JSON.stringify(Invoice1));
最后,我使用此函数通过阅读本文(https://medium.com/@Farzad_YZ/3-ways-to-clone-objects-in-javascript-f752d148054d)来复制对象的内容:
function CopyObject(src, target) {
for (let prop in src) {
if (src.hasOwnProperty(prop)) {
target[prop] = src[prop];
}
}
return target;
}
我想知道除了使用上面的函数之外,有没有更干净的方法可以做到这一点?
我读过很多关于这个问题的帖子,但它们都创建了一个新的对象。
发布于 2019-05-29 02:29:10
我建议在InvoiceModel
的原型中创建一个自动为您完成此操作的方法。
class InvoiceModel {
constructor(num) {
this.num = num
}
duplicate() {
return Object.assign(Object.create(this), this)
}
}
const obj1 = new InvoiceModel(10)
console.log(obj1.num)
const obj1Copy = obj1.duplicate()
console.log(obj1Copy.num)
console.log(obj1Copy === obj1)
发布于 2019-05-29 02:29:46
如果对象只是普通的旧数据对象-没有方法或私有状态-您可以只使用指定的here的深度对象克隆方法。
但是,从外观上看,您正在使用带有构造函数的类,这意味着您有方法和状态。这更加棘手,因为它表明你可能依赖于重新运行的构造函数,例如在闭包中存储私有状态,分配其他资源,或者依赖于某种副作用。在这种情况下,您将需要某种Invoice.prototype.clone
方法,它知道如何将状态注入到新实例中,并重新运行类的构造函数-按照@andrew的答案。
我会避免使用语法target = {...src}
克隆对象,这是一位评论者建议的。一旦你有了像子对象或数组这样的非标量引用成员,这就会给你带来麻烦(因为你将复制指向原始对象的指针,而不是克隆它们的值)。同样的缺陷也适用于您选择的CopyObject
函数。
发布于 2019-05-29 02:34:27
我已经实现了一个对象的深度复制器,它不会覆盖目标选项中的任何内容,但如果需要的话,也可以实现:
var defaults = {
options: {
remove: true,
enable: false,
instance: {}
},
log: {
warn: true,
error: true
}
};
var config = {
options: {
remove: false,
instance: null
}
};
function applyDefaults(d, t) {
if ((typeof d !== "object") && (typeof d !== "array")) {
return d;
}
if (t === undefined) {
if (typeof d === "object") {
t = {};
} else if (typeof d === "array") {
t = [];
}
}
for (var key in d) {
if (t[key] === undefined) {
t[key] = d[key];
} else {
applyDefaults(d[key], t[key]);
}
}
return t;
}
applyDefaults(defaults, config);
console.log(config);
但是,这不会复制未定义为this
成员的“私有”内容。
https://stackoverflow.com/questions/56348002
复制相似问题