我正在查看jQuery以更好地理解它是如何工作的。构造函数基本上只是调用
new jQuery.fn.init
我想知道在jQuery的原型中使用init有什么意义?不会将init()
定义为jQuery对象本身的一部分用于同一目的吗?
基本上我想知道为什么jQuery的init函数位于jQuery.fn.init()
而不是jQuery.init()
是否有人这样做:
jQuery('a').eq(0).hide().init('div').slideToggle(); //?
答案 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插件。
答案 1 :(得分:8)
$()
是(new $())
的实例是(new $.fn.init())
的实例
jQuery采用的技术是如何实现这一目标的。 $()
始终返回,就像使用new
关键字调用它一样。但是,它不是在this
内的function jQuery() {...}
引用上使用条件开关,而是在所有情况下都使用外部委托对象。这个外部委托对象jQuery.fn.init() {...}
被赋予了jQuery原型,因此它的对象'type'是jQuery
,并且它的所有实例实际上都是jQuery
的实例。