Poznajemy Proxy w JS i obchodzimy jeden z problemów funkcji partial z programowania funkcyjnego, jakim jest kolejność podawania argumentów. Do dzieła.
Ok, nasza prosta funkcja:
function func3(x, y, z){
console.log("Arg1: ", x);
console.log("Arg2: ", y);
console.log("Arg3: ", z);
}
console.log(func3("a", "b", "c"));
// Arg1: a
// Arg2: b
// Arg3: c
A teraz przypomnienie funkcji partial z programowania funkcyjnego:
const partialFunc3 = func3.bind(null, "a", "b");
partialFunc3("c");
// Arg1: a
// Arg2: b
// Arg3: c
partialFunc3("x");
// Arg1: a
// Arg2: b
// Arg3: x
Null to oczywiście this binding, reszta to argumenty. Jak widać partial ma swoje ograniczenia, a jest nim kolejność przekazywania argumentów.
Ok, zróbmy proxy dla func3. Najpierw zaprezentuję handlera i zastanówmy się wspólnie co on robi:
const handler = {
apply: function (target, thisArg, argumentsList) {
return target(argumentsList[2], argumentsList[1], argumentsList[0]);
},
};
Apply to się nazywa pułapka. Są różne pułapki (get, set, has – możemy się domyślić co robią). Całość (obiekt z pułapkami) nazywa się handler.
Co robi ten handler to się można domyślić – olewa thisArg i wywołuje funkcję z argumentami, ale poprzestawianymi.
Teraz wystarczy proxy utworzyć:
const handler = {
apply: function (target, thisArg, argumentsList) {
return target(argumentsList[2], argumentsList[1], argumentsList[0]);
},
};
const func3reversed = new Proxy(func3, handler);
console.log(func3reversed("a", "b", "c"));
// Arg1: c
// Arg2: b
// Arg3: a
Tym sposobem możemy mieć – na przykład – funkcję partial, która się nie przejmuje kolejnością argumentów. Bo partial jest bindowany na trzeci i drugi argument, a pierwszy sami podajemy:
const partialFunc3Reversed = func3reversed.bind(null, "c", "b");
partialFunc3Reversed("a");
// Arg1: a
// Arg2: b
// Arg3: c
partialFunc3Reversed("x");
// Arg1: x
// Arg2: b
// Arg3: c
Proxy daje ogólnie ogromne możliwości. My tutaj tylko poznaliśmy jedną pułapkę, w dodatku proxy do funkcji robiliśmy. Jest czego się uczyć!