Помогите понять jQuery jQuery.сноска.init почему init в fn
Я просматривал jQuery, чтобы лучше понять, как он работает. Конструктор в основном просто вызывает
new jQuery.fn.init
мне было интересно, какой смысл иметь init внутри прототипа jQuery? Не определив init()
как часть самого объекта jQuery служит той же цели?
в основном я хотел бы знать, почему функция init jQuery находится в jQuery.fn.init()
, а не jQuery.init()
есть ли люди, которые делают это:
jQuery('a').eq(0).hide().init('div').slideToggle(); //?
2 ответов
EDIT: после перечитывания я не думаю, что это отвечает на ваш вопрос, но это может быть полезно для кого-то лучшего понимания того, как работает jQuery, поэтому я оставляю его.
что происходит, это jQuery()
определяется как jQuery.fn.init()
что еще один способ сказать jQuery.prototype.init()
, который является функцией селектора! Это означает, что никто не будет звонить jQuery.fn.init()
или jQuery.init()
, потому что jQuery()
IS .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')
, jQuery('.class')
, $('ul li a')
... функция селектора!
чтобы никто никогда не звонил jQuery.init('div')
потому что это подробная версия jQuery('div')
после этого назначения. И помните jQuery.fn
это то же самое, что сказать jQuery.prototype
так реально все это делать назначает .init()
как метод прототипа
$()
является instanceof (new $())
является instanceof (new $.fn.init())
техника, используемая jQuery, - это то, как вы можете этого достичь. $()
всегда возвращается, как если бы он был вызван с new
ключевое слово. Однако вместо использования условного переключателя на this
ссылки внутри function jQuery() {...}
он использует внешний объект делегата во всех случаях. Этот внешний объект делегата, jQuery.fn.init() {...}
, дается прототип jQuery, так что его объект " тип " имеет jQuery
, и что все экземпляры на самом деле это экземпляры jQuery
.