¿Puedo capturar (evento desencadenante) cuando se llama a una determinada función en una biblioteca grande no editable ?
// big js library var biglibrary = { runme: function(arguments){ // do something... }, otherfunctions: function(..... }Ahora, ¿cómo puedo fuera de la captura / aviso cuando se llama a runme ? ¿Yo puedo? Intenté algo como esto ->
$(biglibrary).on('runme', function(){ // function was called !!! });En la gran mayoría de los casos, puede envolver la función:
const original = biglibrary.runme; biglibrary.runme = function(...args) { console.log("Function was called!"); return original.apply(this, args); }; const biglibrary = { runme: function(a, b) { console.log(`Original function: ${a} + ${b}`); return a + b; }, }; const original = biglibrary.runme; biglibrary.runme = function(...args) { console.log("Function was called!"); return original.apply(this, args); } console.log(biglibrary.runme(1, 2));Esto a veces se llama "parche de mono".
En algunos casos, la biblioteca puede haber hecho que la propiedad runme de solo lectura, en cuyo caso podría envolverla a través Object.defineProperty :
const original = biglibrary.runme; const descr = Object.getOwnPropertyDescriptor(biglibrary, "runme"); descr.value = function(...args) { console.log("Function was called!"); return original.apply(this, args); } Object.defineProperty(biglibrary, "runme", descr); const biglibrary = { runme: function(a, b) { console.log(`Original function: ${a} + ${b}`); return a + b; }, }; const original = biglibrary.runme; const descr = Object.getOwnPropertyDescriptor(biglibrary, "runme"); descr.value = function(...args) { console.log("Function was called!"); return original.apply(this, args); } Object.defineProperty(biglibrary, "runme", descr); console.log(biglibrary.runme(1, 2));Si la biblioteca ha hecho que la propiedad sea de solo lectura y no configurable, no puede envolverla, pero eso es raro.