Я пытался передать функцию work
в декоратор, где она будет сохранять вызовы функций в массиве work.calls
.
Функция:
work(a, b) {
console.log(a + b);
}
Декоратор:
function decorator(func) {
func.calls = [];
return function(...args) {
func.calls.push(args);
return func.call(this, ...args);
}
}
Декорирование функции work
:
work = decorator(work);
Вызов новой функции:
work(1, 2); // 3
work(4, 5); // 9
for (let args of work.calls) {
console.log( 'call:' + args.join() ); // TypeError: work.calls is not iterable
}
work.calls
- это массив, так почему он не повторяется?
Для справки, есть еще одна версия декоратора, написанная кем-то другим, которая на самом деле работает:
function decorator(func) {
function wrapper(...args) {
wrapper.calls.push(args);
return func.apply(this, arguments);
}
wrapper.calls = [];
return wrapper;
}
work(1, 2); // 3
work(4, 5); // 9
for (let args of work.calls) {
alert( 'call:' + args.join() ); // "call:1,2", "call:4,5"
}
Что здесь делает wrapper
и почему этот способ работает?