首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在javascript中的两个现有对象之间进行复制

如何在javascript中的两个现有对象之间进行复制
EN

Stack Overflow用户
提问于 2019-05-29 02:19:40
回答 3查看 179关注 0票数 2

我有两个相同类型的对象,我想将其中一个对象的内容复制到另一个对象。

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;
}

我想知道除了使用上面的函数之外,有没有更干净的方法可以做到这一点?

我读过很多关于这个问题的帖子,但它们都创建了一个新的对象。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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)

票数 7
EN

Stack Overflow用户

发布于 2019-05-29 02:29:46

如果对象只是普通的旧数据对象-没有方法或私有状态-您可以只使用指定的here的深度对象克隆方法。

但是,从外观上看,您正在使用带有构造函数的类,这意味着您有方法和状态。这更加棘手,因为它表明你可能依赖于重新运行的构造函数,例如在闭包中存储私有状态,分配其他资源,或者依赖于某种副作用。在这种情况下,您将需要某种Invoice.prototype.clone方法,它知道如何将状态注入到新实例中,并重新运行类的构造函数-按照@andrew的答案。

我会避免使用语法target = {...src}克隆对象,这是一位评论者建议的。一旦你有了像子对象或数组这样的非标量引用成员,这就会给你带来麻烦(因为你将复制指向原始对象的指针,而不是克隆它们的值)。同样的缺陷也适用于您选择的CopyObject函数。

票数 2
EN

Stack Overflow用户

发布于 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成员的“私有”内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56348002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档