Ниже приведён общий пример декоратора.У меня такой вопрос: 2й аргумент в декораторе "MyFunc" это и есть обёртка которую возвращает декоратор?
function f(x) {} // любая функция
var timers = {}; // объект для таймеров
// отдекорировали
f = timingDecorator(f, "myFunc");
// запускаем
f(1);
f(2);
f(3); // функция работает как раньше, но время подсчитывается
alert( timers.myFunc ); // общее время выполнения всех вызовов f
реализация с измерителем времени:
var timers = {};
// прибавит время выполнения f к таймеру timers[timer]
function timingDecorator(f, timer) {
return function() {
var start = performance.now();
var result = f.apply(this, arguments); // (*)
if (!timers[timer]) timers[timer] = 0;
timers[timer] += performance.now() - start;
return result;
}
}
// функция может быть произвольной, например такой:
var fibonacci = function f(n) {
return (n > 2) ? f(n - 1) + f(n - 2) : 1;
}
// использование: завернём fibonacci в декоратор
fibonacci = timingDecorator(fibonacci, "fibo");
// неоднократные вызовы...
alert( fibonacci(10) ); // 55
alert( fibonacci(20) ); // 6765
// ...
// в любой момент можно получить общее количество времени на вызовы
alert( timers.fibo + 'мс' );
Декоратор возвращает новую функцию
function timingDecorator(f, timer) {
return function() {
...
Второй аргумент в декораторе - это название свойства, которое создаётся декоратором в объекте timers и куда потом записывается общее время выполнения вызовов функций, которые прошли через декоратор с таким же вторым параметром.
...
if (!timers[timer]) timers[timer] = 0;
timers[timer] += performance.now() - start;
...
Чтобы это увидеть, в вашем же примере есть алерт
alert( timers.myFunc )
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости