2012-01-11 166 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