为什么 jQuery 扩展深拷贝不递归复制对象

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

本文关键字:递归 复制 对象 深拷贝 jQuery 扩展 为什么      更新时间:2023-09-26

我到处搜索并找到了类似的问题,其答案并没有真正解决我的问题,所以如果这看起来像是重复,我深表歉意,但从我的实验来看,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;
    }

的结论是它不是一个"普通对象"。

当您考虑可能应该通过该构造函数创建具有构造函数的对象或至少使用某种"克隆"方法时,这是有意义的,就像您在其他语言/框架中看到的那样。