复制/克隆Javascript对象

时间:2012-01-11 07:36:17

标签: javascript jquery

有没有办法克隆javascript对象?不是DOM元素,而是具有特定构造函数的对象。例如,假设我有一个电话号码对象:

function PhoneNumber(number, type) {
    this.number = number;
    this.type = type;
}

var phoneObj1 = new PhoneNumber('1111111111', 'Home');
var phoneObj2 = //Copy of phoneObj1, but unique so I can set other parameters if necessary.

jQuery使用extend解决了这个问题。

var phoneObj2 = $.extend({}, phoneObj1);

但它返回一个通用对象:

Object{number:'1111111111' type:'Home'}

而不是使用电话号码构造函数名称。我需要一种传递原始phoneObj1的构造函数而不在扩展中实际编写新的PhoneNumber()的方法,因为正在使用的代码被许多不同类型的对象使用,所以在任何给定的时间我都不知道确切的应该使用的构造函数,除了我有一个要引用的对象的事实。

var phoneObj2 = $.extend(new PhoneNumber(), phoneObj1); //I CANNOT do this!

//Maybe something like this?
var phoneObj2 = $.extend(new phoneObj1.constructor.name, phoneObj1); //This throws an error.

4 个答案:

答案 0 :(得分:1)

你可以在每个不同类型的对象上有一个方法(可能称为copy()),它返回该类型对象的构造函数或者只是复制它自己(调用正确的构造函数,因为它知道它是什么样的物体)。因此,您只需在所有对象上调用相同的方法,它就可以为您完成工作。

您可以将此功能放在基类中,并且每个派生类都必须设置构造函数,所有其余代码都是常见的。

答案 1 :(得分:0)

原来那个

var phoneObj2 = $.extend(new phoneObj1.constructor, phoneObj1);

有效吗?我只是在一个不相关的笔记上取消了phoneObj1的构造函数。因此,这可以用作克隆对象的抽象方式,而无需专门编写实际的构造函数。我可以简单地从我正在克隆的对象继承构造函数。

答案 2 :(得分:0)

我只需支持现代版(45)或34)即可使用新的 Object.assign()方法。

  

Object.assign()方法用于复制所有值   枚举从一个或多个源对象到目标的自有属性   宾语。它将返回目标对象。

示例

var phoneObj2 = Object.assign({}, phoneObj1);
console.log(phoneObj2);

这将获取phoneObj1中的所有属性,将它们复制到空对象{},并将组合对象作为phoneObj2返回。使用{}方法后,空phoneObj2对象和assign变量指向内存中的同一对象。

有关详细信息,请查看有关MDN的信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

答案 3 :(得分:-1)

查看完整帖子-> https://jscurious.com/how-to-deep-clone-objects-in-javascript/

const obj = {
      name: 'Amitav', 
      age: 24,
      address: {
          city: 'Bangalore',
          state: 'Karnataka'
      }
};
 
const makeDeepClone = (obj) => {
    let newObject = {};
 
    Object.keys(obj).map(key => {
        if(typeof obj[key] === 'object'){
            newObject[key] = makeDeepClone(obj[key]);
        } else {
            newObject[key] = obj[key];
        }
  });
 
  return newObject;
}
 
const copyObj = makeDeepClone(obj);
console.log(copyObj); 
// {name: "Amitav", age: 24, address: {city: "Bangalore", state: "Karnataka"}}
copyObj.address.state = 'Odisha';
console.log(obj.address.state); // "Karnataka"
console.log(copyObj.address.state); // "Odisha"