我在一個模塊中有一個日志類,它包含一個回傳自身實體的靜態函式,因此簡化版本如下所示:
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;
uj5u.com熱心網友回復:
您需要從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);
uj5u.com熱心網友回復:
我相信你真的想.constructor.prototype.在你的方法中使用這個錯誤:
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');
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/314612.html
標籤:javascript 班级 遗产 覆盖 工厂
