Я разбираюсь в написании плагинов для jQuery, и я пытаюсь понять различие между $.f и $.fn.f
Я видел, как авторы pluggin используют оба, или иногда присваивают $.f = $.fn.f
Может кто-нибудь объяснить это мне, рассуждения, преимущества и т.д.
Я разбираюсь в написании плагинов для jQuery, и я пытаюсь понять различие между $.f и $.fn.f
Я видел, как авторы pluggin используют оба, или иногда присваивают $.f = $.fn.f
Может кто-нибудь объяснить это мне, рассуждения, преимущества и т.д.
Глядя на исходный код 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).
$.f - это функция утилиты, тогда как $.fn.f является плагином/методом jQuery.
Функция полезности в основном является функцией в пространстве имен jQuery, которая полезна для выполнения некоторой операции, например, $.isArray(obj) проверяет, является ли объект obj массивом. Полезно размещать функции в пространстве имен jQuery, если вы будете часто их использовать, а также для предотвращения глобального загрязнения пространства имен.
Методы jQuery, с другой стороны, работают с объектами jQuery/завернутыми наборами. Например, $(document.body).append('<p>Hello</p>'); добавит абзац, содержащий Hello, в элемент body документа. $.fn является сокращением для $.prototype в более поздних версиях jQuery (это не всегда было в более ранних версиях библиотеки). Вы использовали бы это при написании собственных плагинов.
$.fn.f - это просто ярлык для jQuery.prototype
Используя fn, вы можете добавлять методы плагинов без использования метода extend:
jQuery.fn.myPlugin = function(opts) { ... }