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

Почему jQuery делает это: jQuery.fn.init.prototype = jQuery.fn?

Маленький расширенный вопрос - почему jQuery do

jQuery.fn = jQuery.prototype = {
init: function() {...},
    f1: function() {...},
    ...
};
jQuery.fn.init.prototype = jQuery.fn;

Почему бы просто не добавить f1() и т.д. в init.prototype? Разве это эстетично или есть какие-то глубокие идеи?

4b9b3361

Ответ 1

jQuery.fn - это просто псевдоним для jQuery.prototype. Я полагаю, что это определено для эстетических и менее типичных причин.

Итак,

jQuery.fn.init.prototype = jQuery.fn;

на самом деле

jQuery.prototype.init.prototype = jQuery.prototype;

Как это должно быть сделано, это сообщение полезно:

Он дает функции init() одно и то же прототип как объект jQuery. Так когда вы вызываете init() как конструктор в "return new jQuery.fn.init( селектор, контекст);" statement, it использует этот прототип для объекта, который он строит. Это позволяет init() замените конструктор jQuery сам по себе.

Вы достигнете того, что объект, возвращенный из конструктора jQuery.fn.init, имеет доступ к методам jQuery.

Ответ 2

Функция jQuery.fn.init - это та, которая выполняется при вызове jQuery(".some-selector") или $(".some-selector"). Вы можете увидеть это в этом фрагменте из jquery.js:

jQuery = window.jQuery = window.$ = function( selector, context ) {
    // The jQuery object is actually just the init constructor 'enhanced'
    return new jQuery.fn.init( selector, context );
}

Итак, на самом деле указанная вами строка имеет решающее значение для того, как jQuery позволяет добавлять функциональность к объектам jQuery, как внутри самого jQuery, так и из плагинов. Это строка:

jQuery.fn.init.prototype = jQuery.fn;

Назначив jQuery.fn в качестве прототипа этой функции (и поскольку первый фрагмент использует "новый" для обработки jQuery.fn.init в качестве конструктора), это означает, что функциональность, добавленная через jQuery.fn.whatever, сразу доступна на объекты, возвращаемые всеми вызовами jQuery.

Так, например, можно создать и использовать простой плагин jQuery следующим образом:

jQuery.fn.foo = function () { alert("foo!"); };
jQuery(".some-selector").foo();

Когда вы объявляете "jQuery.fn.foo" в первой строке, то, что вы на самом деле делаете, это добавление этой функции к прототипу всех объектов jQuery, созданных с помощью функции jQuery, такой как функция на второй строке. Это позволяет вам просто вызвать "foo()" по результатам функции jQuery и вызвать ваши функции плагина.

Короче говоря, написание jQuery-плагинов будет более подробным и подверженным будущему поломке, если детали реализации будут изменены, если эта строка не существует в jQuery.