Исходники jQuery - основная часть
Код конструктора jQuery:
var jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
// объект jQuery фактически инициализирует конструктор 'расширенный'
return new jQuery.fn.init( selector, context, rootjQuery );
},
Этот код делает следующее: при вызове функции jQuery создается и возвращается сущность "jQuery.fn.init
".
Чуть далее видим следующее:
jQuery.fn = jQuery.prototype = {
constructor: jQuery,
init: function( selector, context, rootjQuery ) {
[...]
}
[...]
}
// Give the init function the jQuery prototype for later instantiation
jQuery.fn.init.prototype = jQuery.fn;
Как мы видим jQuery.fn
— это ничто иное, как прототип jQuery.
Также, jQuery.fn.init.prototype указывает на прототип jQuery, и конструктор jQuery.fn.init.prototype
указывает на jQuery.
p.s. Свойство constructor
должно быть в каждом объекте и указывать, какой функцией создан объект.
Такой подход даёт нам очень интересный результат.
$(document) instanceof jQuery; // true
$(document) instanceof jQuery.fn.init; // true
Чтобы вы поняли суть такого поведения, я приведу вам другой пример:
var Init = function () {
console.log('[Init]');
};
var jQuery = function () {
console.log('[jQuery]');
return new Init();
};
Init.prototype = jQuery.prototype = {
constructor: jQuery
};
var $elem = jQuery(); // [jQuery] , [Init]
console.log( $elem instanceof jQuery ); // true
console.log( $elem instanceof Init ); // true
Таким образом, всё конструирование находится в функции-объекте jQuery.fn.init
, а jQuery — это фабрика объектов jQuery.fn.init
По материалам статьи: Как устроен jQuery: изучаем исходники
Комментарии к статье