Javascript 为什么jQuery扩展了deepcopy而不是递归地复制对象?

Javascript 为什么jQuery扩展了deepcopy而不是递归地复制对象?,javascript,jquery,extend,javascript-objects,deep-copy,Javascript,Jquery,Extend,Javascript Objects,Deep Copy,我到处搜索,发现了类似的问题,但答案并没有真正解决我的问题,所以如果这看起来像是重复,我很抱歉,但从我的实验来看,jQuery的深度复制功能实际上并没有按照描述的那样工作,或者可能是我误读了它的描述 下面是一个示例,演示了我遇到的问题: 或下载此文件: 为什么在操作深度副本时会更改上一个副本中的数据?首先,您没有创建普通对象 我正在查看用于extend的jQuery1.7.2的源代码 我注意到这句话: if ( deep && copy && ( jQuery

我到处搜索,发现了类似的问题,但答案并没有真正解决我的问题,所以如果这看起来像是重复,我很抱歉,但从我的实验来看,jQuery的深度复制功能实际上并没有按照描述的那样工作,或者可能是我误读了它的描述

下面是一个示例,演示了我遇到的问题:

或下载此文件:


为什么在操作深度副本时会更改上一个副本中的数据?

首先,您没有创建普通对象

我正在查看用于extend的jQuery1.7.2的源代码

我注意到这句话:

if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy))
必须计算为true才能进行深度复制。复制只是正在复制的当前对象的一部分

但您并不是在创建普通对象。您正在创建通过使用新运算符调用构造函数生成的对象

现在,在isPlainObject中,似乎必须对这些行进行评估。其中hasOwn是hasOwn=Object.prototype.hasOwnProperty

这就是它得出的结论,它不是一个普通物体


<> P>这是有意义的,当你认为有一个构造函数的对象可能应该通过那个构造函数创建,或者至少使用一些在其他语言/框架中看到的克隆方法。

你想使用jQuery的.C克隆吗?最近在jQuery论坛上有一个关于这个的线索。我认为您的用例不符合$.extend方法的目的。这是一张相关的虫子票,很高兴我没有发疯!我最初调查的是jQuery.clone,但我看到了一个类似问题的答案,决定先试试。更新:看起来是这样。clone不会克隆我的对象类型。只有DOM对象。我认为现在最好的解决方案是为我的每个对象编写一个克隆函数,让它们自己处理自我复制。谢谢!这就是我想要的解释。我已经为我创建的每个对象编写了一个.clone函数。不幸的是,我使用的hacky方式.extend显然是将对象复制到了我的应用程序可以工作的深度,但又很浅,不会浪费内存,所以现在我的实现是一个可怕的内存占用器!回到绘图板上!
    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;
    }