Итак, я пишу веб-приложение. Практически все делается на стороне клиента, сервер - это только интерфейс RESTful. Я использую jQuery в качестве моей выборки и реализую свой код в Выявление шаблона модуля.
Каркас моего кода в основном выглядит следующим образом:
(function($){
$.fn.myplugin = function(method)
{
if (mp[method])
{
return mp[method].apply(this, Array.prototype.slice.call(arguments, 1));
}
else if (typeof method === 'object' || ! method)
{
return mp.init.apply(this, arguments);
}
else
{
$.error('Method ' + method + ' does not exist on $.myplugin');
}
};
var mp =
{
init : function( options )
{
return this.each(function()
{
// stuff
}
},
callbacks : {},
addCallback : function(hook_name, cb_func, priority)
{
// some sanity checking, then push cb_func onto a stack in mp.callbacks[hook_name]
},
doCallbacks : function(hook_name)
{
if (!hook_name) { hook_name = arguments.callee.caller.name; }
// check if any callbacks have been registered for hook_name, if so, execute one after the other
}
};
})(jQuery);
Довольно просто, правильно?
Теперь мы можем регистрировать (множественные, иерархические) обратные вызовы изнутри, а также извне области приложения.
Что меня подслушивает: чтобы сделать все возможное настолько расширяемым, мне пришлось бы прибегнуть к чему-то в этом направлении:
foo : function() {
mp.doCallbacks('foo_before');
// do actual stuff, maybe some hookpoints in between
mp.doCallbacks('foo_after');
}
Каждая отдельная функция внутри моего приложения должна начинаться и заканчиваться так. Это просто не кажется правильным.
Итак, JS волшебники SO - что делать?