Декораторы
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