2012-01-11 145 views
2

有没有办法克隆javascript对象?不是DOM元素,而是具有特定构造函数的对象。比如可以说我有一个电话号码对象:复制/克隆Javascript对象

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的解决了这个问题,我带扩展。

​​

但它返回一个通用对象:

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. 
+2

可能重复(HTTP://计算器。问题/ 122102 /什么是最有效的方法克隆一个JavaScript对象) – fyr 2012-01-11 07:38:55

+0

一些很好的答案在这里http://stackoverflow.com/questions/332422/how-do-i这个名称的对象类型在JavaScript的 – georg 2012-01-11 07:39:40

+0

赞同'fyr'。我将这个镜头作为最直接的方式:Object.create(obj); – dbrin 2012-01-11 07:46:43

回答

1

你可能对每个不同类型的对象,要么返回构造该种对象的或只是一个方法(可能称为copy())使得其自身的副本(调用合适的构造,因为它知道它是什么样的对象)。所以,你只需在所有的对象上调用相同的方法,它为你做了工作。

你可以把这个功能放在一个基类中,每个派生类所要做的就是设置构造函数,其余的代码都是常见的。

0

原来,

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

确实工作。我只是取消phoneObj1的构造函数的一个不相关的说明。因此,这可以用作克隆对象的抽象方式,而无需专门编写实际的构造函数。我可以简单地从我克隆的对象继承构造函数。

0

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

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

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

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

欲了解更多信息,签上MDN的信息:什么是克隆JavaScript对象的最有效方法]的https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

+0

@ryandlf,如果我的答案为你工作,你可以[投票](https://stackoverflow.com/help/privileges/vote-up)或[接受](https://meta.stackexchange.com/questions/ 5234/how-does-accepting-an-answer-work)呢? – Eric 2015-11-03 08:03:38