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

В программировании термин перехват (hooking) охватывает ряд методов, используемых для изменения или дополнения поведения операционной системы, приложений или других программных компонентов путем перехвата вызовов функций, сообщений или событий, передаваемых между программными компонентами. Код, который обрабатывает подобные перехваченные вызовы функций, события или сообщения, называется перехватчиком (hook).

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 не будет опубликован. Обязательные поля помечены *