簡體   English   中英

為什么jQuery Extend Deep Copy不遞歸地復制對象?

[英]Why does jQuery Extend Deep Copy not recursively copy an object?

我到處搜索並找到了類似的問題,但答案並沒有真正解決我的問題,因此,如果這看起來像是重復的話,我深表歉意,但是從我的實驗看來,jQuery的深度復制功能實際上並沒有像它描述的那樣起作用(也許我誤讀了它的描述)。

這是一個演示我遇到的問題的示例: http : //jsfiddle.net/wcYsH/

或此下載: https : //github.com/kevroy314/jQuery-Extend-Test

當操縱深層副本時,為什么先前副本中的數據會被更改?

首先,您沒有創建普通對象。

我正在查看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”。

當您考慮使用某個構造函數的對象可能應該通過該構造函數創建對象,或者至少使用某種“克隆”方法(如在其他語言/框架中看到的那樣)時,這才有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM