我正在深入研究jQuery的插件,我试图理解$ .f和$ .fn.f之间的区别
我见过插件作者使用两者,或者有时会分配$ .f = $ .fn.f
有人可以向我解释这个,推理,好处等吗?
答案 0 :(得分:13)
查看jQuery源代码将清除问题。顺便说一句,jQuery
和$
引用相同的对象,这就是jQuery对象的定义方式:
var jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context );
}
jQuery
是一个函数,在Javascript中,函数也是Function
类型的对象。所以jQuery.f
或$.f
将f
附加到jQuery Function
对象,或者如果愿意,可以将其称为jQuery类。
如果您查看jQuery的来源,您会看到已将jQuery.prototype
分配给jQuery.fn
jQuery.fn = jQuery.prototype
因此,无论何时将方法(或属性)附加到jQuery.fn
,如jQuery.fn.f = ..
或$.fn.f = ..
,jQuery.prototype.f = ..
或$.prototype.f = ..
,该方法将可用于此jQuery类的所有实例(同样,Javascript中没有类,但它可能有助于理解)。
每当你调用jQuery()
函数时,就像在jQuery("#someID")
中一样,在这一行上创建了一个新的jQuery实例:
return new jQuery.fn.init( selector, context );
并且此实例包含我们附加到原型的所有方法,但不包含直接附加到Function
对象的方法。
如果您尝试调用未在正确位置定义的函数,则会出现异常。
$.doNothing = function() {
// oh noez, i do nuttin
}
// does exactly as advertised, nothing
$.doNothing();
var jQueryEnhancedObjectOnSteroids = $("body");
// Uncaught TypeError: Object #<an Object> has no method 'doNothing'
jQueryEnhancedObjectOnSteroids.doNothing();
哦,最后还是缩短了一个很长的线程并回答你的问题 - 做$.f = $.fn.f
允许你将该函数用作插件或实用程序方法(在jquery lingo中)。
答案 1 :(得分:4)
$.f
是一个实用函数,而$.fn.f
是一个jQuery插件/方法。
实用程序函数基本上是jQuery命名空间中的一个函数,用于执行某些操作,例如,$.isArray(obj)
检查对象obj
是否为数组。如果您经常使用它们并且还要避免全局名称空间污染,将函数放在jQuery名称空间中是很有用的。
$(document.body).append('<p>Hello</p>');
会将包含Hello的段落附加到文档的body元素。 $.fn
是jQuery更高版本中$.prototype
的简写(它并不总是在库的早期版本中)。你可以在编写自己的插件时使用它。
答案 2 :(得分:4)
$.fn.f
只是jQuery.prototype
通过使用fn
,您可以在不使用extend方法的情况下添加插件方法:
jQuery.fn.myPlugin = function(opts) { ... }