Tengo una clase de registro en un módulo que contiene una función estática para devolver una instancia de sí mismo, por lo que una versión simplificada se ve así:
Class Logger { static createFromConfig(key) { return new Logger(key); } info(message) { // do logging stuff } debug(message) { // do logging stuff } error(message) { // do logging stuff } }Esto se usa en muchos lugares a lo largo de nuestra base de código como:
import logging from 'logging'; const log = logging.Logger.createFromConfig('keyname'); log.info('App starting');En un proyecto, deseo agregar alguna funcionalidad adicional a la función de error, sin tener que cambiar el código en ninguno de los lugares que lo llaman. Entonces algo como
log.error = () => { // do my extra stuff here log.error() // call the original error function }Intenté extender la clase como se muestra a continuación, pero creo que el problema es que la clase base original simplemente se devuelve de la función estática, por lo que no se llama a mi función anulada:
class dblogger extends logging.Logger { error(...args) { // do my extra stuff here super.error(); } } const dblogging = { Logger: dblogger }; export default dblogging;Debe llamar al método original desde el prototipo Logger .
function getdblogger(keyname) { const log = logging.Logger.createFromConfig(keyname); log.error = function(message) { // do my extra stuff here Logger.prototype.error.call(this, message) // call the original error function } return log; } Tenga en cuenta que debe usar una función ordinaria en lugar de una función de flecha para que obtenga this .
Si puede realizar cambios en la clase Logger original, puede createFromConfig() para permitir que se especifique la clase, luego puede usar su subclase.
Class Logger { static createFromConfig(key, loggerClass = Logger) { return new loggerClass(key); } info(message) { // do logging stuff } debug(message) { // do logging stuff } error(message) { // do logging stuff } }Luego en sus archivos:
const log = logging.Logger.createFromConfig('keyname', dblogger);Creo que realmente quieres usar este .constructor.prototype. error dentro de su método:
class Logger{ static createFromConfig(key){ return new Logger(key); } info(message){ // do logging stuff } debug(message){ // do logging stuff } error(message){ return message; // do logging stuff } } class logging extends Logger{ } const log = logging.createFromConfig('test'); log.error = function(message){ console.log(this.constructor.prototype.error('Logger message here')); console.log(message); } log.error('within log');