所以我找到了一种方法来包装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(...)
}
如果我能够在调用者的上下文中深入了解多个函数,那么我可以保持函数的小。
答案 0 :(得分:1)
您可以使用"special: "
设置默认参数(字符串bind
)。所以这应该有效:
specialLog = Function.prototype.bind.call(console.log, console, "Special: ");
// ^^^^^^^^^^^^^^
说明:
调用specialLog
时,传递给console.log
的第一个参数将始终为"Special: "
,因此如果您将其称为:{/ p>
specialLog("Hello, world!");
就好像你打电话给console.log
一样:
console.log("Special: ", "Hello, world!");
打印字符串:"Special: Hello, world!"
,即您想要的结果。
user7552(op)编辑:
对于我的情况,它将是:
specialLog = Function.prototype.bind.call(this.log, console, "Special:");
使用this.log
(调试器类中的引用),而不是console.log
。