Создание обёртки‑шпиона для любой функции

Обёртка увеличивает счётчик, сохраняет аргументы, вызывает исходную функцию с тем же 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее