javascript - 为什么 jQuery Extend Deep Copy 不递归复制一个对象?

标签 javascript jquery extend javascript-objects deep-copy

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

它在那里得出结论,它不是“普通对象”。

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

关于javascript - 为什么 jQuery Extend Deep Copy 不递归复制一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10505144/

相关文章:

javascript - 获取没有最后一段的 URL 路径

javascript - jQuery.ajax - 使用新值更新表格单元格

javascript - 从响应文本中提取字符串

javascript - 如何将选定时隙数组格式化为格式化字符串

jquery - .fadeOut() 方法使用可见性属性而不是显示属性

object - powershell 扩展一个对象

javascript - 文档准备功能

jquery - 如何使div在发布后可点击

routes - Umbraco 4.10 + 扩展 Global.ascx

magento - 向 OPC 添加步骤而不覆盖