javascript - 如何覆盖从javascript中的模块返回的类中的函数
问题描述
我在一个模块中有一个日志类,它包含一个返回自身实例的静态函数,因此简化版本如下所示:
Class Logger {
static createFromConfig(key) {
return new Logger(key);
}
info(message) {
// do logging stuff
}
debug(message) {
// do logging stuff
}
error(message) {
// do logging stuff
}
}
这在我们的代码库中的许多地方都有使用,例如:
import logging from 'logging';
const log = logging.Logger.createFromConfig('keyname');
log.info('App starting');
在一个项目中,我希望为错误函数添加一些额外的功能,而不必更改任何调用它的地方的代码。所以像
log.error = () => {
// do my extra stuff here
log.error() // call the original error function
}
我尝试过像下面这样扩展类,但我认为问题是原始基类只是从静态函数返回,所以我的覆盖函数没有被调用:
class dblogger extends logging.Logger {
error(...args) {
// do my extra stuff here
super.error();
}
}
const dblogging = {
Logger: dblogger
};
export default dblogging;
解决方案
您需要从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;
}
请注意,您必须使用普通函数而不是箭头函数才能获得this
.
如果您可以对原始Logger
类进行更改,您可以更改createFromConfig()
以允许指定类,然后您可以使用您的子类。
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
}
}
然后在您的文件中:
const log = logging.Logger.createFromConfig('keyname', dblogger);
推荐阅读
- python-3.x - Python3没有根据另一个字典正确排序列表
- python - Python2 base64 严格解码仍然默默地忽略无效字符
- c# - 使用 BackgroundWorker 填充 ListView:UI 元素不属于线程
- mysql - 触发参数错误。日期范围不起作用
- ibm-cloud - IBM Cloud Certificate Manager:无法使用 curl 命令检索证书列表
- git - Git 中的配置命令
- angular - 如何在 HTML 表中创建索引列
- sql - 将带时区的时间戳转换为星期几
- python - Pyhon - 从文本文件导入 URL 并在代码运行时循环
- java - 在java中的docx文件中从右到左写入的问题