Помогите понять jQuery в jQuery.fn.init Почему init в fn - PullRequest
43 голосов
/ 21 января 2011

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

new jQuery.fn.init

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


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

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

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

Ответы [ 2 ]

52 голосов
/ 21 января 2011

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

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

8 голосов
/ 02 апреля 2012

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

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

...