Декоратор принимает произвольную функцию и возвращает новую функцию, которая делает то же самое, что исходная, но при этом выполняет какие-то дополнительные действия.
Декоратор spy
позволяет определить:
Функция repeat
принимает строку и число, а возвращает новую строку. Мы можем вызвать функцию spy
от функции repeat
и получить новую функцию. Назовем ее spyRepeat
.
Функция spyRepeat
ведет себя так же, как исходная: принимает те же два аргумента и возвращает строку. Но в джаваскрипте функция является объектом, поэтому у spyRepeat
добавляются три метода: callCount
, wasCalledWith
и returned
.
function repeat(str, count) { return str.repeat(count); } const spyRepeat = spy(repeat); console.log(spyRepeat("abc", 2)); // === "abcabc" console.log(spyRepeat("xx", 4)); // === "xxxxxxxx" console.log(spyRepeat.callCount()); // === 2 console.log(spyRepeat.wasCalledWith("abc")); // === true console.log(spyRepeat.wasCalledWith(4)); // === true console.log(spyRepeat.wasCalledWith(5)); // === false console.log(spyRepeat.returned("xxxxxxxx")); // === true console.log(spyRepeat.returned("qwerty")); // === false