所以我有一个难题,希望有人已经掌握了答案。阅读jQuery源码,我还没有理解这里真正发生了什么。
$('#div') //returns a jQuery object
$( $('#div') ) // returns an identical jQuery object
$( $( $( $( $( $('#div') ) ) ) ) ) // returns the same idential object
我已经遇到插件开发中的实例,我不知道期待sting选择器或jQuery对象。在那些实例中,我只是将选择器或jQuery对象传递给jQuery,以便保证我想要的jQuery对象。它运作良好,但感觉太神奇了。我这样做的时候真的发生了什么?还有更好的方法吗?
答案 0 :(得分:1)
基本我认为在函数$(...)
中存在一些基本情况为。
但实际上存在更多案例,并且在此之前有一堆调试和错误检查。
在http://jsapi.info/jquery/1.8.0/jQuery.fn.init查看更多信息 我可以从代码中看到,如果我们有。
var x = $('#div');
var y = $(x);
x
和y
的内容相同
但x
和y
的记忆并不相同。
说我们有:
class $ {
var x;
$($ t) {
this.x = t.x
}
}
如果我们都调用$
,这将具有相同的内在价值
但实际上并不是两个不同的对象。
答案 1 :(得分:1)
在回答这个问题之前,需要了解的是,$(...)返回一个具有类似数组属性的特殊对象。来自文档:
jQuery factory函数$()返回一个有很多的jQuery对象 数组的属性(长度,[]数组访问运算符, 等),但与阵列不完全相同,缺少一些 数组的内置方法(如.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 );
函数makeArray()将提供的选择器转换为类似数组的对象,只需设置this.length
属性和this.ret[0]=..., this.ret[1]=...
,使其“感觉”像一个数组,同时它仍然是基于jQuery原型的对象(又名$.fn
)。请记住,上面代码中的this
只是原型中$.fn
的全新对象。
此外,.selector
和.context
属性将从原始属性复制到此。
重要的是要注意,例如, .prevObject
属性将丢失,但可能会添加一个新属性,具体取决于方法链接。
总而言之,它需要时间和内存,当有人可能将jQuery对象传递到您的插件时,简单地检查.selector
可能是有意义的。另一方面,与原始行为具有相同行为的新实例可能会有所帮助。