首页 > 解决方案 > 我发现很难在 Javascript 中克隆对象

问题描述

我有一个网络应用程序,用户可以在其中点击copy引擎对象的按钮。

我用Javascript编写了下面的方法,它可以工作。但是,如果克隆的用户超过 2 或 3 个,则会弹出随机错误。例如,它会说,Engine is undefinedengineToClone is undefined

但如果只有一个人在做,它永远不会出错。

所以我想知道是否有更好的方法来写这个:

    var engineToClone = this.model;

    var clonedEngine = new Engine({
        factoryId: engineToClone.attributes.factoryId,
        title: 'CLONED OF - ' + engineToClone.attributes.title,
        engineDescription: engineToClone.attributes.engineDescription,
        isFrontend: engineToClone.attributes.isFrontend,
        cylinders: engineToClone.cylinders,
        headers: engineToClone.headers,
        vehicles: engineToClone.vehicles,
        pistons: engineToClone.pistons,
        fuels: engineToClone.fuels
    });
    
    clonedEngine.save(null, {
        url: self.factory.url()
    }).done(function () {
    });

我试过这样做,但它会生成空值:

    var engineToClone = this.model;

    var clonedEngine = engineToClone;

但是 clonedEngine 总是返回为空。

我还在这里阅读了使用 json 的答案,所以我尝试了这个:

JSON.parse(JSON.stringify(engineToClone))

但它总是说 JSON 是未定义的。

所以我一定是做错了什么,我希望有人能指出我正确的方向。

谢谢!

标签: javascriptecmascript-6

解决方案


奇怪的JSON是未定义,但还有另一种解决方案使用Object.assign(). 基本上,它从原始对象中获取每个属性并将其复制到{}.

const myObject = {
  some: "properties",
  that: "could",
  be: "cloned",
}

let clone = Object.assign({}, myObject);

myObject.x = 
  "the original was edited... what happens to the clone?";

console.log(clone);

请注意,这是一个“浅拷贝”。如果myObject有嵌套对象,并且这些对象稍后被编辑,则副本也会受到影响。如果您需要“深拷贝”,您应该使用该JSON.parse(JSON.stringify(object))解决方案。


如果您需要复制除少数之外的所有属性,您可以使用以下命令:

const clone = (obj, ...ignore) => {
  let copy = Object.assign({}, obj); //copy the object
  for (var i of ignore) delete copy[i]; //delete everything from ignore
  return copy; //return what's left (the good bits)
};

var myObject = { key: "value", a: "b", id: "theId" };
var myClone = clone(myObject, "id");

console.log(myClone);


推荐阅读