У меня есть привычка делать вопросы без необходимости, включив вне темы и бесполезные тирады. На этот раз я постараюсь не делать этого. Прошу прощения за отсутствие лучшего и более наглядно название.Редактор плагинов CoffeeScript и jQuery
Итак, вот код CoffeeScript.
(($, window, document) ->
# Conventionally 'private' variables
_name = 'aPlugin'
_defaults =
property: 'value'
_debug = (args) ->
console.log args
return
# Plugin constructor
Plugin = (element, options) ->
@element = element
@options = $.extend true, {}, _defaults, options
@init()
return
# Initialization
Plugin.prototype.init =() ->
# Initialization logic here
_debug(@element) unless typeof(@element)=='undefined'
return
# Plugin wrapper, allowing for multiple instances
# and chainability
$.fn[_name] = (options) ->
return @.each (idx) ->
($.data @, 'plugin_' + _name
new Plugin @, options
) unless $.data @, 'plugin_' + _name
return
) jQuery, window, document
Вот тот же код, скомпилированный (или скомпилированный) на JavaScript.
(function() {
(function($, window, document) {
var Plugin, _debug, _defaults, _name;
_name = 'aPlugin';
_defaults = {
property: 'value'
};
_debug = function(args) {
console.log(args);
};
Plugin = function(element, options) {
this.element = element;
this.options = $.extend(true, {}, _defaults, options);
this.init();
};
Plugin.prototype.init = function() {
if (typeof this.element !== 'undefined') {
_debug(this.element);
}
};
$.fn[_name] = function(options) {
return this.each(function(idx) {
if (!$.data(this, 'plugin_' + _name)) {
$.data(this, 'plugin_' + _name);
return new Plugin(this, options);
}
});
};
})(jQuery, window, document);
}).call(this);
И, просто чтобы быть ясно, я называю этот плагин так:
jQuery(document).ready(function($) {
$('#specialDiv').aPlugin({ aString: 'Hello world!', aNumber: 62742, aObject: { aString: 'Hello aPlugin!', aNumber: 6274210 } });
});
options
аргумент в плагине вызова не имеет никакого значения. Это для целей тестирования.
У меня есть два вопроса:
- в переводе, JavaScript, предполагаемый код был автоматически завернутые в
(function(){}).call(this)
. Я этого раньше не видел. Что оно делает? Это безопасно? Тем не менее, это несколько стандарт кодирования (поскольку CoffeeScript делает это). Что-то добавить здесь: я новичок в CoffeeScript, поэтому это может быть побочным продуктом неуместной скобки или чего-то еще. Тем не менее, похоже, это не мешает операции. - Когда код выполнен, я получаю
<div id="specialDiv"> </div>
. В коде вы можете увидеть, что я вызывалconsole.log()
с вызывающим (который должен быть объектом jQuery) в качестве аргумента. Где он распаковывается?
Благодарим вас за ваше время.
Я написал простой шаблон/оболочку jQuery plugin, который может вам пригодиться. См. Https://github.com/davesag/coffeescript-jquery-plugin-template. Он завершен с проверками QUnit, является 100% Coffeescript и демонстрирует как генерировать мини-файлы с помощью sourceMaps. –