Декораторы

by robotas

JavaScript

// вспомогательная функция для проверки на число
function checkNumber(value) {
  return typeof value == 'number';
}

// Создаем ф-ию декоратор с параметрами currentFunction (засовуем сюда ф-ию), и ? (checkNumber) checks - массив с ф-ями для проверки
function typeCheck(currentFunction, checks) {
	// возвращаем ф-ию
  return function() {
  
  // по идеии мы перебираем аргументы ф-ии которая выше
  // но по факту мы перебираем аргументы которе попадают в ф-ию currentFunction
  // на сколько я понимаю это происходит из за .apply
 // можешь пояснить чуть подробнее ? 

	// как я понял, .apply(this, arguments), значит, что мы попросту кусок кода for, переносим в ф-ию currentFunction
	// а строка return function () {...} это просто как условная "формальность"
  
    for (var i = 0; i < arguments.length; i++) {
      if (!checks[i](arguments[i])) {
        alert( "Некорректный тип аргумента номер " + i );
        return;
      }
    }
    //
    return currentFunction.apply(this, arguments);
  }
}

// создаем ф-ию суммирования
function sum(a, b) {
  return a + b;
}

// оборачиваем ее в декоратор, которому указываем ? тот массив с  ф-иями
var test = typeCheck(sum, [checkNumber, checkNumber]); 

// пользуемся функцией как обычно ? но как ее аргументы передаются 
alert( test(1, 2) ); // 3, все хорошо

// а вот так - будет ошибка
alert(test(true, null)); // некорректный аргумент номер 0
alert(test(1, ["array", "in", "sum?!?"])); // некорректный аргумент номер 1