I would like to make a generic function wrapper that (for example) prints the called function and its arguments.
Doing so is easy through the arguments quasi-array and simple calls. For example:
function wrap(target, method) {
return function() {
console.log(Array.prototype.slice.call(arguments).join(', '));
return method.apply(target, arguments);
}
}
However, this way of doing of course completely loses the arity of the called function (if you didn’t know, one can obtain the arity (number of arguments) of a JavaScript function through its length property).
Is there any way to dynamically create a wrapper function that would copy the arguments of the wrapped function to itself?
I’ve thought about creating a new Function object, but I don’t see any way to statically extract the arguments list, since the arguments property is deprecated.
Here’s a solution using
Function:EDIT:
Here’s a more abstract solution, which fixes the closure problem:
And a better one, that preserves context when invoked:
Used as: