Открыть меню    

Исходники 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: изучаем исходники

Комментарии к статье

Добавить комментарий к сниппету