back to the lesson

Spy decorator

importance: 5

Create a decorator spy(func) that should return a wrapper that saves all calls to function in its calls property.

Every call is saved as an array of arguments.

For instance:

function work(a, b) {
  alert( a + b ); // work is an arbitrary function or method

work = spy(work);

work(1, 2); // 3
work(4, 5); // 9

for (let args of work.calls) {
  alert( 'call:' + args.join() ); // "call:1,2", "call:4,5"

P.S. That decorator is sometimes useful for unit-testing. Its advanced form is sinon.spy in Sinon.JS library.

Open a sandbox with tests.

Here we can use calls.push(args) to store all arguments in the log and f.apply(this, args) to forward the call.

function spy(func) {

  function wrapper(...args) {
    return func.apply(this, arguments);

  wrapper.calls = [];

  return wrapper;

Open the solution with tests in a sandbox.