Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么jQuery扩展了deepcopy而不是递归地复制对象?_Javascript_Jquery_Extend_Javascript Objects_Deep Copy - Fatal编程技术网

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 && ( jQuer

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

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

或下载此文件:


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

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

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

我注意到这句话:

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

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

现在,在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;
    }
在这里,它得出结论,它不是一个“普通物体”


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

你想改用
jQuery
.clone
吗?最近在jQuery论坛上有一个关于这个的帖子。我认为你的用例不符合$.extend方法的目的。这是一个相关的错误通知单,很高兴我没有发疯!
jQuery
.clone是我最初调查的内容,但我看到了一个类似问题的答案,决定先试试。更新:看起来是这样的。克隆不会克隆我的对象类型。只克隆DOM对象。我认为现在最好的解决方案是为我的每个对象编写一个克隆函数,并让它们自己处理自我复制。谢谢!这就是问题所在我一直在寻找解释。我已经为我创建的每个对象编写了一个.clone函数。不幸的是,我使用的黑客方法.extend显然是将对象复制到了我的应用程序能够工作的深度,但又足够浅,以至于不浪费内存,所以现在我的实现是一个可怕的内存消耗!回到drawi跳板!