Честно говоря, я не знал, как сделать заголовок короче.
Я узнал, как написать плагин jQuery, изучив источник SlidesJS плагин. Когда я столкнулся с чем-то новым, я просто спросил своего хорошего друга Google и большую часть времени получил удовлетворительный ответ. Честно говоря, я никогда не прилагал больших усилий. Все, что я знаю, это то, что $
является (вероятно) сокращенным конструктором объектов jQuery и что $()
и jQuery()
- это то же самое, что и при включении jQuery.
В последнее время я попытался понять науку jQuery и как написать плагин jQuery хороший. Я столкнулся с очень хорошей статьей в которой автор перечислил несколько шаблонов для создания плагина jQuery. Поскольку все остальное было слишком сложным для меня, мне понравился первый: легкий старт. Теперь вот код для указанного шаблона.
/*!
* jQuery lightweight plugin boilerplate
* Original author: @ajpiano
* Further changes, comments: @addyosmani
* Licensed under the MIT license
*/
// the semi-colon before the function invocation is a safety
// net against concatenated scripts and/or other plugins
// that are not closed properly.
;(function ( $, window, document, undefined ) {
// undefined is used here as the undefined global
// variable in ECMAScript 3 and is mutable (i.e. it can
// be changed by someone else). undefined isn't really
// being passed in so we can ensure that its value is
// truly undefined. In ES5, undefined can no longer be
// modified.
// window and document are passed through as local
// variables rather than as globals, because this (slightly)
// quickens the resolution process and can be more
// efficiently minified (especially when both are
// regularly referenced in your plugin).
// Create the defaults once
var pluginName = 'defaultPluginName',
defaults = {
propertyName: "value"
};
// The actual plugin constructor
function Plugin( element, options ) {
this.element = element;
// jQuery has an extend method that merges the
// contents of two or more objects, storing the
// result in the first object. The first object
// is generally empty because we don't want to alter
// the default options for future instances of the plugin
this.options = $.extend( {}, defaults, options) ;
this._defaults = defaults;
this._name = pluginName;
this.init();
}
Plugin.prototype.init = function () {
// Place initialization logic here
// You already have access to the DOM element and
// the options via the instance, e.g. this.element
// and this.options
};
// A really lightweight plugin wrapper around the constructor,
// preventing against multiple instantiations
$.fn[pluginName] = function ( options ) {
return this.each(function () {
if (!$.data(this, 'plugin_' + pluginName)) {
$.data(this, 'plugin_' + pluginName,
new Plugin( this, options ));
}
});
}
})( jQuery, window, document );
Я включил комментарии, чтобы ссылаться на них в моих вопросах.
У меня есть грубая идея, почему window
и document
были включены в аргумент анонимной функции, которая обертывает плагин (я не знаю, что еще назвать), потому что он указан в комментариях, он sorta kinda сокращает время выполнения. Но как это работает? Любой аргумент указанной анонимной функции, переносящий плагин, передается туда где? И как они рассматриваются в плагине?
Обычно я делал $(window).resize(function(){})
, но в этом случае это не работает. Если я делаю console.log(window)
внутри функции плагина, он говорит "undefined".
Это подводит меня к другому вопросу: что такое undefined? Разве это не тип данных, который присваивается объекту, который не определен в области видимости? Как это можно передать в качестве аргумента? Разве аргументы не должны быть объектами? В комментариях написано несколько строк, но я не понимаю ни слова об этом: < поэтому мы можем гарантировать, что его значение действительно undefined > whaaa?
Подводя итог:
- Что в действительности означает
function($)
? - Почему я должен включать
window
,document
иundefined
в качестве аргументовfunction($)
? - Если я это сделаю, как мне получить доступ к фактическим объектам
window
иdocument
? -
undefined
что и почему?
Прощай, пожалуйста. Я никогда не изучал язык программирования как предмет для явной цели написания приложений. Я изучил базовый C для написания аппаратно-ориентированных низкоуровневых подпрограмм для крошечных микроконтроллеров и что-то вроде этого. Я изучил С++ широко и немного Java самостоятельно. Просто чтобы вы знали, чего ожидать.