用正确的文件/行号包装控制台日志包装器?

时间:2017-09-16 13:11:41

标签: javascript typescript

所以我找到了一种方法来包装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(...)
}

如果我能够在调用者的上下文中深入了解多个函数,那么我可以保持函数的小。

1 个答案:

答案 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