当jQuery自己传递时会发生什么?

时间:2012-09-19 20:43:26

标签: jquery jquery-plugins

所以我有一个难题,希望有人已经掌握了答案。阅读jQuery源码,我还没有理解这里真正发生了什么。

 $('#div')      //returns a jQuery object
 $( $('#div') ) // returns an identical jQuery object
 $( $( $( $( $( $('#div') ) ) ) ) ) // returns the same idential object

我已经遇到插件开发中的实例,我不知道期待sting选择器或jQuery对象。在那些实例中,我只是将选择器或jQuery对象传递给jQuery,以便保证我想要的jQuery对象。它运作良好,但感觉太神奇了。我这样做的时候真的发生了什么?还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

基本我认为在函数$(...)中存在一些基本情况为。

  • 在Arg中是String类型,传递此内容并查找或创建HTML Dom元素,然后将其封装到JQuery对象中。
  • 在Arg中是HTML Dom类型,将对象封装成JQuery对象
  • 在Arg中是JQuery Object,返回它是

但实际上存在更多案例,并且在此之前有一堆调试和错误检查。

http://jsapi.info/jquery/1.8.0/jQuery.fn.init查看更多信息 我可以从代码中看到,如果我们有。

var x = $('#div');
var y = $(x);

xy的内容相同 但xy的记忆并不相同。

说我们有:

class $ {
  var x;
  $($ t) {
    this.x = t.x
  }
}

如果我们都调用$,这将具有相同的内在价值 但实际上并不是两个不同的对象。

答案 1 :(得分:1)

在回答这个问题之前,需要了解的是,$(...)返回一个具有类似数组属性的特殊对象。来自文档:

  

jQuery factory函数$()返回一个有很多的jQuery对象   数组的属性(长度,[]数组访问运算符,   等),但与阵列不完全相同,缺少一些   数组的内置方法(如.pop()和.reverse())。

所以,这就是发生的事情。

  1. 无论选择器的类型如何,都会调用new jQuery.fn.init( selector, context, rootjQuery );,因此会创建一个新对象,并在此init()构造函数中设置其属性。

  2. $(...)的论点经过空虚,DOMElement,字符串或函数的检查(通过isFunction)

  3. 所有检查都失败,最后调用以下代码。

    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可能是有意义的。另一方面,与原始行为具有相同行为的新实例可能会有所帮助。