帮助理解jQuery的jQuery.fn.init为什么在fn中使用init

时间:2011-01-21 01:30:00

标签: javascript jquery initialization prototype

我正在查看jQuery以更好地理解它是如何工作的。构造函数基本上只是调用

new jQuery.fn.init

我想知道在jQuery的原型中使用init有什么意义?不会将init()定义为jQuery对象本身的一部分用于同一目的吗?


基本上我想知道为什么jQuery的init函数位于jQuery.fn.init()而不是jQuery.init()

是否有人这样做:

jQuery('a').eq(0).hide().init('div').slideToggle(); //?

2 个答案:

答案 0 :(得分:51)

编辑:重新阅读后,我认为这不会回答你的问题,但是对于某人更好地理解jQuery如何运作可能会有用,所以我就离开了。


正在发生的事情是jQuery()被定义为jQuery.fn.init(),这是另一种说jQuery.prototype.init()的选择函数!这意味着没有人会拨打jQuery.fn.init()jQuery.init(),因为jQuery().init()

什么?

让我们来看看你谈论的那段代码:

// Define a local copy of jQuery
var jQuery = function( selector, context ) {
        // The jQuery object is actually just the init constructor 'enhanced'
        return new jQuery.fn.init( selector, context );
    },

在评论中它说的只是我所说的,但更简单。但这只是jQuery的本地副本...但是,如果你在自执行函数结束时转到第908行(版本1.4.4),你会看到:

// Expose jQuery to the global object
return (window.jQuery = window.$ = jQuery);

})();

...表示此本地jQuery成为全局jQuery。所以?那么......这个本地jQuery实际上是jQuery.fn.init()对吗?那么init()是什么?如果你从第100行到第208行看,你会发现它是选择器方法。什么是选择器方法?这是您一直使用的方法来查找标签,ID,类...... $('#id')jQuery('.class')$('ul li a') ...选择器功能!

所以没有人会打电话给jQuery.init('div'),因为在该作业之后它是jQuery('div')的冗长版本。请记住jQuery.fn与说jQuery.prototype完全相同,所以该部分所做的就是将.init()指定为jQuery对象原型的方法。 I.E.一个jQuery插件。

Phew,那是满口的。我希望这是有道理的,如果有任何更正,以防我在这个冗长的解释的任何部分误导,请告诉我。

答案 1 :(得分:8)

$()(new $())的实例是(new $.fn.init())的实例

jQuery采用的技术是如何实现这一目标的。 $()始终返回,就像使用new关键字调用它一样。但是,它不是在this内的function jQuery() {...}引用上使用条件开关,而是在所有情况下都使用外部委托对象。这个外部委托对象jQuery.fn.init() {...}被赋予了jQuery原型,因此它的对象'type'是jQuery,并且它的所有实例实际上都是jQuery的实例。