我到处搜索,发现类似的问题并没有真正解决我的问题,所以如果这似乎是重复,我深表歉意,但从我的实验来看,jQuery 的深层复制功能实际上并没有像描述的那样工作(或也许我误读了它的描述)。
这是一个演示我遇到的问题的示例:http: //jsfiddle.net/wcYsH/
或者这个下载: https ://github.com/kevroy314/jQuery-Extend-Test
为什么操作深拷贝时,前一个副本中的数据会发生变化?
我到处搜索,发现类似的问题并没有真正解决我的问题,所以如果这似乎是重复,我深表歉意,但从我的实验来看,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;
}
它在那里得出结论,它不是“plainObject”。
当您考虑具有构造函数的对象可能应该通过该构造函数创建或至少使用某种“克隆”方法时,这是有道理的,就像您在其他语言/框架中看到的那样。