Eventify
Не давали мне покоя рассуждения начатые в заметке Продвинутая теория создания плагинов и решил я написать плагин, который бы переводил все методы переданного объекта в события. Конечно же сам объект не должен быть нарушен, то есть должен иметь возможность вызывать свои методы напрямую, более того при любом вызове любого метода должны отрабатывать еще два события onBeforeMethod и onAfterMethod.
Скорее всего сейчас вас мучает вопрос на кой хер это вообще надо. Это глубоко эзотерические размышления над архитектурой, которые простым людям нах не нужны. Но я надеюсь что в конце концов они приведут к какой-то универсальной форме создания плагинов не нарушая идеологию jQuery но позволяя передавать данные и получать результаты в плагин простым и красивым способом.
Итак что же вышло?
(function($) {
var Plugin = function (elt, obj) {
var element = $(elt);
for (var prop in obj){
(function(self,obj,prop){
if ($.isFunction(obj[prop])){
self[prop] = function(){
var result, eventName = prop.charAt(0).toUpperCase() + prop.substr(1);
element.trigger("onBefore" + eventName, [self, arguments]);
result = obj[prop].apply(self, arguments);
element.trigger("onAfter" + eventName, [self, arguments, result]);
};
element.bind(prop, $.proxy(function(){
self[prop].apply(self, Array.prototype.slice.call(arguments, 1));
}, self));
}else{
self[prop] = obj[prop];
}
})(this,obj,prop);
}
};
$.fn.plugin = function(obj) {
this.each(function() {
new Plugin(this, obj);
});
return this;
};
})(jQuery);
Использовать можно примерно так
$(document).ready(function(){
$("#qwerty").bind("onBeforeMethod1 onAfterMethod1 onBeforeMethod2 onAfterMethod2", function(e){
console.log(e.type, arguments);
}).plugin({
method1 : function (){
console.log("method1",this);
this.method2(1,2,3);
},
method2 : function (){
console.log("method2",this);
console.log("method2",arguments);
return arguments;
}
}).trigger("method1").trigger("method2",[1,2,3])
});
пример на прототипе:
Как использовать:
твой камент в спам упал ;)
да, если задуматься, то так и есть
спасибо за пример