Подтвердить что ты не робот

Помогите понять jQuery jQuery.fn.init Почему init в fn

Я искал jQuery, чтобы лучше понять, как это работает. Конструктор в основном просто вызывает

new jQuery.fn.init

Мне было интересно, в чем смысл инициализации внутри прототипа jQuery? Не будет ли определяться init() как часть самого объекта jQuery?


В принципе, я хотел бы знать, почему функция init jQuery находится в jQuery.fn.init(), а не jQuery.init()

Есть ли люди, которые это делают:

jQuery('a').eq(0).hide().init('div').slideToggle(); //?
4b9b3361

Ответ 1

РЕДАКТИРОВАТЬ: После повторного чтения я не думаю, что это отвечает на ваш вопрос, но может быть полезно, чтобы кто-то лучше понял, как работает 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() как метода прототипа объекта jQuery. И.Е. плагин jQuery.

Фу, это был глоток. Я надеюсь, что это имеет смысл, и если у кого-то есть какие-либо поправки в случае, если я дезинформирован в любой части этого длинного объяснения, пожалуйста, дайте мне знать.

Ответ 2

$() является экземпляром (new $()) является экземпляром (new $.fn.init())

Техника, используемая jQuery, заключается в том, как вы можете достичь этого. $() всегда возвращается, как если бы он был вызван с ключевым словом new. Однако вместо использования условного переключателя в this ссылке внутри function jQuery() {...} во всех случаях используется внешний объект-делегат. Этот внешний объект-делегат, jQuery.fn.init() {...}, получает прототип jQuery, так что его "тип" объекта имеет jQuery и что все его экземпляры на самом деле являются экземплярами jQuery.