2012-05-08 21 views
9

我到處搜索,發現類似的問題,但沒有真正解決我的問題,所以我很抱歉,如果這似乎是一個重複,但從我的實驗看來,jQuery的深層複製函數實際上並不工作,因爲它的描述(或者我誤解了它的描述)。爲什麼jQuery擴展Deep Copy不是遞歸地複製一個對象?

這裏有一個例子證明我有這個問題: https://github.com/kevroy314/jQuery-Extend-Test

爲什麼當深拷貝操作在以前的副本中的數據得到改變: http://jsfiddle.net/wcYsH/

或者這樣的下載?

+1

你想用'jQuery'的'.clone'代替嗎? –

+1

在jQuery論壇上有一個關於這個的話題最近,我認爲你的用例不屬於$ .extend我的用途的ThOD。 https://forum.jquery.com/topic/deep-copies-using-extend-on-object-instances –

+1

這是一個相關的錯誤票http://bugs.jquery.com/ticket/10014 –

回答

5

其中之一,你不創建正常的對象。

我正在查看jQuery 1.7.2的擴展源代碼。

https://github.com/jquery/jquery/blob/master/src/core.js

而且我注意到行:

if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) 

必須評估到true做深度複製。複製只是被複制的當前對象的一部分。

但是您並未創建「普通」對象。您正在創建通過使用new運算符調用構造函數生成的對象。

現在,在isPlainObject中,似乎必須對這些行進行評估。 (其中hasOwn是​​hasOwn = Object.prototype.hasOwnProperty

try { 
     // Not own constructor property must be Object 
     if (obj.constructor && 
      !hasOwn.call(obj, "constructor") && 
      !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) { 
      return false; 
     } 
    } catch (e) { 
     // IE8,9 Will throw exceptions on certain host objects #9897 
     return false; 
    } 

還有就是它的結論是不是「plainObject」。

這是有道理的,當你考慮的對象有一個構造也應該可以通過這個構造或創建最少使用某種「克隆」方法,就像你在其他語言/框架中看到的那樣。

+1

謝謝!這是我正在尋找的解釋。我已經爲每個創建的對象寫了一個.clone函數。不幸的是,我使用的hacky方式顯然是將對象複製得足夠深以至於我的應用程序能夠工作,但是足夠淺以至於不浪費內存,所以現在我的實現是一個可怕的內存消耗!回到繪圖板! – user986122

相關問題