为什么jQuery Extend Deep Copy不能递归复制对象?

use*_*122 9 javascript jquery deep-copy extend javascript-objects

我到处搜索并发现类似的问题,答案并没有真正解决我的问题,所以我道歉,如果这似乎是重复,但从我的实验中看来,jQuery的深拷贝功能实际上并没有像它描述的那样工作(或也许我误读了它的描述).

这是一个展示我遇到的问题的例子:http: //jsfiddle.net/wcYsH/

或者这个下载:https: //github.com/kevroy314/jQuery-Extend-Test

为什么在操作深层副本时,前一个副本中的数据会发生变化?

Jay*_*ayC 5

首先,您不是在创建普通对象.

我正在查看jQuery 1.7.2 for source的源代码.

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

而且我注意到这条线:

if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy))
Run Code Online (Sandbox Code Playgroud)

必须评估要true进行深度复制.copy只是当前要复制的对象的一部分.

但你不是在创造"普通"物体.您正在创建通过使用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;
    }
Run Code Online (Sandbox Code Playgroud)

而且它的结论是它不是"plainObject".

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