Špiónský dekorátor
důležitost: 5
Vytvořte dekorátor špión(funkce), který by měl vrátit obal, který si bude ukládat všechna volání funkce do své vlastnosti volání.
Každé volání bude uloženo jako pole argumentů.
Například:
function práce(a, b) {
alert( a + b ); // práce je jakákoli funkce nebo metoda
}
práce = špión(práce);
práce(1, 2); // 3
práce(4, 5); // 9
for (let argumenty of práce.volání) {
alert( 'volání:' + argumenty.join() ); // "volání:1,2", "volání:4,5"
}
P.S. Takový dekorátor je někdy užitečný pro jednotkové testování. Jeho pokročilá forma je sinon.spy v knihovně Sinon.JS.
Obal, který vrátí špión(f), by si měl uložit všechny argumenty a pak pomocí f.apply přesměrovat volání.
function špión(funkce) {
function obal(...argumenty) {
// použijeme ...argumenty místo arguments, abychom do obal.volání uložili „skutečné“ pole
obal.volání.push(argumenty);
return funkce.apply(this, argumenty);
}
obal.volání = [];
return obal;
}