在jQuery中,$ .myFunction和$ .fn.myFunction有什么区别?

时间:2010-03-07 21:20:07

标签: jquery-plugins

我正在深入研究jQuery的插件,我试图理解$ .f和$ .fn.f之间的区别

我见过插件作者使用两者,或者有时会分配$ .f = $ .fn.f

有人可以向我解释这个,推理,好处等吗?

3 个答案:

答案 0 :(得分:13)

查看jQuery源代码将清除问题。顺便说一句,jQuery$引用相同的对象,这就是jQuery对象的定义方式:

var jQuery = function( selector, context ) {
    return new jQuery.fn.init( selector, context );
}

jQuery是一个函数,在Javascript中,函数也是Function类型的对象。所以jQuery.f$.ff附加到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名称空间中是很有用的。

另一方面,jQuery方法对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) { ... }