Декоратор функции пишет в её свойство её аргументы
Не могу понять, почему внешний проход let..of не видит массива. Дебаггером пробежался, уже на строке с присваиванием декоратора массив пропадает из свойств work, но при этом что в первом его вызове (work (1,2)), что во втором в какой-то массив аргументы work всё таки пушатся.
let work = function (a, b) {
console.log ( a + b ); // произвольная функция или метод
};
function spy(func) {
func.calls = [];
return function (...args) {
func.apply (null, arguments);
func.calls.push (args);
}
}
work = spy(work);
work(1, 2); // 3
work(4, 5); // 9
for (let args of work.calls) {
console.log ( 'call:' + args.join() ); // "call:1,2", "call:4,5"
}
Ответы (1 шт):
Функция spy возвращает новую функцию.
В строке work = spy(work); ссылка на старую функцию work теряется.
В то же время, внутри spy свойство calls добавляется в аргумент func, в который передается старая функция.
Таким образом если не перетирать исходное значение все будет работать как и ожидалось:
let work = function(a, b) {
console.log(a + b); // произвольная функция или метод
};
function spy(func) {
func.calls = [];
return function(...args) {
func.apply(null, arguments);
func.calls.push(args);
}
}
let work1 = spy(work);
work1(1, 2); // 3
work1(4, 5); // 9
for (let args of work.calls) {
console.log('call:' + args.join()); // "call:1,2", "call:4,5"
}
Если же нужно, чтобы свойство добавлялось не в исходную функцию, а в создаваемую, вместо func необходимо добавлять его в новую функцию:
let work = function(a, b) {
console.log(a + b); // произвольная функция или метод
};
function spy(func) {
decorator.calls = [];
return decorator;
function decorator(...args) {
func(...args);
decorator.calls.push(args);
}
}
work = spy(work);
work(1, 2); // 3
work(4, 5); // 9
for (let args of work.calls) {
console.log('call:' + args.join()); // "call:1,2", "call:4,5"
}