Обёртка увеличивает счётчик, сохраняет аргументы, вызывает исходную функцию с тем же this и записывает возвращённое значение. Результат передаётся вызывающему без изменений.
Создание обёртки‑шпиона для любой функции
Обёртка увеличивает счётчик, сохраняет аргументы, вызывает исходную функцию с тем же this и записывает возвращённое значение. Результат передаётся вызывающему без изменений.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Реализуйте функцию spy, которая принимает другую функцию и возвращает её обёртку, имитирующую поведение оригинала. Помимо выполнения, обёртка должна сохранять информацию о каждом вызове: количество вызовов в data.calls, массив переданных аргументов в data.args и полученные результаты в data.results. Пример использования:
function _sum(a, b) {
return a + b
}
function spy(f) {
// ТУТ ПИШЕМ КОД
}
const sum = spy(_sum)
console.log(sum(2, 2)) // 4
console.log(sum(21, 21)) // 42
/* КОЛИЧЕСТВО ВЫЗОВОВ ФУНКЦИИ _sum */
console.log(sum.data.calls) // 2
/* ВРЕМЕНИ С КОТОРЫМИ была вызвана функция _sum, с сохранением порядка вызовов */
console.log(sum.data.args) // [(2, 2], [21, 21])
/* результаты, которые вернула функция _sum, с сохранением порядка вызовов */
console.log(sum.data.results) // [4, 42]
Ответ
Обёртка увеличивает счётчик, сохраняет аргументы, вызывает исходную функцию с тем же this и записывает возвращённое значение. Результат передаётся вызывающему без изменений.
function spy(f) {
function wrapped(...args) {
const index = wrapped.data.calls++;
wrapped.data.args[index] = args;
const result = f.apply(this, args);
wrapped.data.results[index] = result;
return result;
}
wrapped.data = { calls: 0, args: [], results: [] };
return wrapped;
}
Индексы фиксируются до вызова, поэтому сохраняется порядок даже при рекурсивном обращении к обёртке. Синхронная ошибка пробрасывается; соответствующая позиция results остаётся незаполненной. Для async-функции записывается сам Promise, не его будущий результат. Это обёртка обычных вызовов, не прозрачная замена конструктора с new.