该原型扩展正在打破$.each方法,因为该方法使用以下方法检测数组和对象之间的关系length
财产(在jQuery 1.4.2):
// core.js Line 533
each: function( object, callback, args ) {
var name, i = 0,
length = object.length, // <--- your function from Object.prototype
isObj = length === undefined || jQuery.isFunction(object);
//...
如您所见,isObj
仅当变量不包含length
属性(或属性值为undefined
).
If isObj
为 false,jQuery 将尝试使用正常的迭代for
loop:
for ( var value = object[0];
i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
然后,appendTo
方法是使用创建的$.each
,这就是为什么没有定义:
//...
jQuery.each({
appendTo: "append",
prependTo: "prepend",
insertBefore: "before",
insertAfter: "after",
replaceAll: "replaceWith"
},
//...
I will 总是推荐远离延伸Object.prototype
,当你扩展这个原型时ALL对象接收这些附加属性。
这是特别有问题的,因为当您迭代对象的属性时
这些新属性的出现会导致各种意外行为。