Перехват вызова функций в JavaScript

function emptyFunction() {};
 
function Interceptor(preInvoke, postInvoke) {
  var preInvoke = typeof preInvoke === 'function' ? preInvoke : emptyFunction,
  postInvoke = typeof postInvoke === 'function' ? postInvoke : emptyFunction;
  this.preInvoke = preInvoke;
  this.postInvoke = postInvoke;
}
 
Interceptor.prototype = {
  constructor: Interceptor,
  interceptInvokes: function (callback) {
    var self = this;
    return function () {
      var args = Array.prototype.slice.call(arguments, 0),
      result;        
      self.preInvoke.call(self, callback, args); 
      result = callback.apply(self, args);
      self.postInvoke.call(self, callback, args, result);
      return result;
    };
  }
}
 
/***
  Пример использования
***/
 
// Функция, вызов которой мы собираемся перехватить
function test(value) {
  value = value + 100;
  return value;
}
 
// Настраиваем перехватчик вызова
var logInterceptor = new Interceptor(function(callback, args) {
  console.log(args); // Покажем аргументы, перехваченного вызова
}, null);
test = logInterceptor.interceptInvokes(test); // Указываем фуекцию, которую хотим перехватить
 
console.log(test(2016)); // Вызываем тестовую функцию

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *