所以我找到了一種方法來包裝console.log
,這樣當通過包裝器調用它時,它將保存從其被調用位置保存的文件/行號。用正確的文件/行號包裝控制檯日誌的包裝?
但我想知道如何再包裹一次(如果實際的logging
恰好處於非常深的級別,可能是幾次)。
class Debugger {
_log() {
return Function.prototype.bind.call(console.log, console);
}
log = this._log();
specialLog(msg: string) {
this.log('special: ' + msg);
}
}
const debug = new Debugger();
debug.log('hi'); // works perfect: correct file/line number
debug.specialLog('hi'); // line number -> where this.log() is called.
從這個示例代碼,我應該怎麼修改specialLog
使其作品爲log
?
我試過.bind
,.apply
,.call
試圖通過console
上下文,但沒有成功的幾種組合。
更新:
specialLog(msg: string) {
return this.log.bind(console, 'special ' + msg);
}
debug.specialLog('hi')(); // correct, but notice the extra '()'
這是最接近我能得到,但有沒有辦法做到這一點,而不必調用後執行呢?
更新2:的jsfiddle
https://jsfiddle.net/mqa1duvr/
更新3:原因我需要它穿過其他包裝:
實際調試器看起來是這樣的:
class Debugger {
debug(...)
trace(...)
// and inside each these debug..trace..warn etc..
// there are set colors, timestamps, send log to server etc..
// then, finally after all the filters, there's the "final" log.
_log(...)
}
如果我能做到在具有調用者的上下文的同時深入探究多個功能,然後我可以保持較小的功能。
我得到一個'Uncaught SyntaxError:Unexpected token ='。當然,這是有效的JS? –
對不起,我將添加打字稿標記 – user7552
關於更新,請使用'call'而不是'bind'。 –