Функция 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.
Я не уверен, что вы подразумеваете, добавив f1() в init.prototype? Он не добавляет «во что-либо», он назначает прототип. –
Несомненно. Конечно, я имею в виду «назначить». Извините за мой английский.И вопрос в том, почему бы просто не назначить все функции init.prototype? Почему они назначены jQuery.prototype и jQuery.prototype, назначенные jQuery.prototype.init.prototype – NilColor
Связанный вопрос о шаблоне дизайна jQuery: http://stackoverflow.com/q/12143590/1048572 – Bergi