Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Ext.override(Function, {
decorate: function(fPre, fPost) {
var _this = this;
return function () {
if (fPre) fPre.call(this, arguments);
var res = _this.apply(this, arguments);
if (fPost) fPost.call(this, res, arguments);
return res;
};
}
});
>>> var add = function (a, b) {return a+b;}
>>> add1 = add.decorate(function(args){console.info('function called with args:', args)}, function(res){console.info('end returned:',res)})
function()
>>> add1(2,5)
function called with args: [2, 5]
end returned: 7
7
_this, который просто вызывается внутри декоратора. В то время, как мой декоратор имеет внутри себя ссылку на оригинальную ф-цию, что важно. Мой декоратор по сути полностью «оборачивает» исходную ф-цию, и манипулирует ей внутри себя как хочет. В то время, как Ext-овский вариант просто добавляет вызовы «до» и «после».Function.prototype.decorate = function () ...javascript:f=function(x){alert(x)};f=f.decorate(function(x){alert('decorator: '+x); arguments.callee.old.apply(this, arguments)});f(5);
* This source code was highlighted with Source Code Highlighter.alert() :-)Function.method, Function.decorate и Function.restore — красиво. От остального можно избавиться.Function.arguments. Но получается, что заменил не везде :-) Я это исправил.Object и Function (всё делается через объект Ajaxpect)true, если переданное в неё имя метода соответствует неким условиямaddBefore, addAfter и addAround — недоработано. К примеру:addAfter легко выкидывается и реализуется через addAround, т.к. вы передаёте в декоратор и оригинальную ф-цию, и её аргументыaddBefore — вы сначала выполняете функцию-декоратор, которая по сути возвращает изменённые arguments в оригинальную ф-цию, и тут же вызываете оригинальную ф-цию. Декоратор «before» должен иметь возможность остановить выполнение оригинальной ф-ции.Function.addAround. Но он легко реализуем у меня через Function.decorate(...).removeBefore(...) и removeAfter(...). addBefore: если хоть один из addBefore-listener'ов возвращает false, оригинальная ф-ция не выполнится.
Слушаем вызовы функций в Javascript