在回答这个问题之前,需要了解 $(...) 返回一个具有类似数组属性的特殊对象。从文档中:
jQuery 工厂函数 $() 返回一个 jQuery 对象,该对象具有数组的许多属性(长度、[] 数组访问运算符等),但与数组不完全相同,缺少数组的一些内置属性-in 方法(例如 .pop() 和 .reverse())。
所以,这就是发生的事情。
无论选择器的类型如何,new jQuery.fn.init( selector, context, rootjQuery );
都会调用它,因此会创建一个新对象,并在此init()
构造函数中设置其属性。
$(...) 的参数经过检查是否为空、DOMElement、字符串或函数(通过 isFunction)
所有检查均失败,最后调用以下代码。
if (selector.selector !== undefined ) {
this.selector = selector.selector;
this.context = selector.context;
}
return jQuery.makeArray( selector, this );
this.length
函数 makeArray() 通过简单地设置属性将提供的选择器转换为类似数组的对象,this.ret[0]=..., this.ret[1]=...
这样它就“感觉”像一个数组,而它仍然是一个基于 jQuery 原型(又名$.fn
)的对象。请记住,this
上面的代码只是原型中的一个全新对象$.fn
。此外,.selector
属性.context
从原始复制到此。
重要的是要注意,例如.prevObject
属性将丢失,但可能会根据方法链接添加一个新属性。
总而言之,这需要时间和内存,简单地检查.selector
何时有人可能将 jQuery 对象传递到您的插件中可能是有意义的。另一方面,与原始实例具有相同行为的新实例可能会有所帮助。