Единственный способ перехватить вызовы функций - это Прокси их
function a() { /*...*/ }
a = new Proxy(a, {
apply(fn, context, args) {
console.log("custom things");
return Reflect.apply(fn, context, args);
}
});
a();
Однако все функции должны быть явно проксированы, прежде чем ловушка будет выполнена. Или, если у функции нет свойств, это намного проще с:
function wrap(fn) {
return function(...args) {
fn.call(this, ...args);
};
}
a = wrap(a);