Помогите понять 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.