Agregue una línea de código a TODAS las funciones

Así que estoy trabajando mucho en JS, y estoy trabajando mucho con eventos (bash de mantenerme lo más modular posible). Actual Estoy llamando Event.fire('eventName') al final de cada función. Estoy buscando una forma de que CUALQUIER función en mi objeto / clase llame automáticamente a Event.fire([function name]) al final de todas las funciones

Ejemplo:

 function MyClass(){ this.on('someFunc', this.funcTwo); this.someFunc(); } MyClass.prototype.on = function( event ){ // the event stuff // } MyClass.prototype.someFunc = function(){ console.log('someFunc'); } MyClass.prototype.funcTwo = function(){ console.log('funcTwo'); } 

Podría intentar algo como esto, modificando dinámicamente sus funciones:

 var obj = MyClass.prototype; for (var prop in obj) if (typeof obj[prop] == "function") // maybe also prop != "on" and similar (function(name, old) { obj[prop] = function() { var res = old.apply(this, arguments); Event.fire(name); return res; }; })(prop, obj[prop]); 

Puede crear una función que cree funciones que siempre tengan esa funcionalidad:

 var eventFunctionFactory = function(fn, e) { if (typeof fn != 'function' || typeof e != 'function') { throw new TypeError('Invalid function!'); } return function(/* arguments */) { // Convert arguments to array var args = Array.prototype.slice.call(arguments); // Fire event Event.fire(e); // Call the function with the applied arguments // Return its result return fn.apply(fn, args); }; }; var myClass = function() { this.someFunction = eventFunctionFactory( // Function function(a, b) { return a + b; }, // Event function() { console.log('someFunction fired!'); } ); }; var myObj = new myClass(); // Outputs: // someFunction fired! // 3 console.log(myObj.someFunction(1, 2)); 

la forma más fácil es tener una clase proxy. asumiendo que su clase regular es clase A y la clase proxy es clase B. La clase B tiene una instancia de clase A internamente. la clase B también tiene un stub para cada función de Clase A que llama a su clase interna una instancia. Luego, puede agregar cualquier código que desee a la clase original simplemente agregando código al talón asociado, antes o después de la llamada de función a la clase A.

Para poder usar la clase mejorada, todo lo que necesita hacer es modificar el rest de su aplicación para instanciar la clase B en lugar de la clase A. La ventaja con este método es que su clase original permanece intacta.