2013-08-06 25 views
0

我有一個對象:Javascript:如何複製對象並保持其原型鏈?

var obj = { 
    name: "Mike" 
} 

// and its prototype property: 
obj.__proto__: 
    say: function() {...} 
    walk: function() {...} 

我想複製它,並保持__proto__

開始我還以爲jQuery的$.extend方法:

$.extend({}, obj)

但什麼是回報將合併__proto__如:

{ 
    name: "Lee", 
    say: function() {}, 
    walk: function() {} 
} 

那麼如何複製對象並保留原型鏈?

回答

0

所有的Firet,你想要什麼樣的副本?深拷貝還是淺拷貝?假設你想要淺拷貝;只需複製src的自己的財產(除非dest已具有相同的財產)和__proto__dest

function copy(dest, src) { 
    var p; 
    for (p in src) { 
     if (src.hasOwnProperty(p) && !dest.hasOwnProperty(p)) { 
      dest[p] = src[p]; 
     } 
    } 
    dest.__proto__ = src.__proto__; 
} 

小提琴:http://jsfiddle.net/U6uY4

如果你想深複製,替換for .. in循環到與你的使用情況符合深拷貝算法。


請注意,這是不常見的要求。我建議你再想一想你真正想做什麼。

+0

我想深拷貝 – hh54188

+0

你不得不提及它的問題。無論如何,你真的想要複製嗎? JavaScript中的深層副本比您想象的要困難得多。你的財產可以是「RegExp」或「Date」嗎?你有這種情況下的任何用例嗎?考慮這一點,然後谷歌* JavaScript深拷貝*並選擇最合適的方法,然後替換'for .. in'循環。 – Mics