Почему jQuery делает это: jQuery.fn.init.prototype = jQuery.fn? - PullRequest
19 голосов
/ 18 ноября 2009

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

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

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

Ответы [ 2 ]

47 голосов
/ 18 ноября 2009

Функция 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 в качестве прототипа этой функции (и поскольку первый фрагмент использует 'new' для обработки 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.

20 голосов
/ 18 ноября 2009

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

Так

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

на самом деле

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

А почему это нужно сделать, это сообщение на форуме полезно:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...