2017-09-16 5 views
1

だから、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. 

それはlogとして動作するように、どのように私はspecialLogを変更する必要がありますか?
私は.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

私は 'Uncaught SyntaxError:Unexpected token ='を取得します。これは有効なJSですか? –

+1

申し訳ありませんが、typescriptタグ – user7552

+0

を追加します。更新については、 'bind'の代わりに' call'を使用してください。 –

答えて

1

bindを使用して、デフォルトの引数(文字列"special: ")を設定できます。だから、これは動作するはずです:

specialLog = Function.prototype.bind.call(console.log, console, "Special: "); 
//                ^^^^^^^^^^^^^^ 

説明:あなたはそれを呼び出す場合は好きなので呼び出さspecialLog

は、console.logに渡される最初の引数は常に、"Special: "次のようになります。

specialLog("Hello, world!"); 

それはのようになります:

console.log("Special: ", "Hello, world!"); 

文字列:"Special: Hello, world!"を出力します。

user7552(OP)編集:私の場合のために
、それは次のようになります。

specialLog = Function.prototype.bind.call(this.log, console, "Special:"); 

this.log(デバッガクラスの内部参照)、代わりのconsole.logを使用。

+0

あなたの助けてくれてありがとう、更新をチェックしてください3なぜ別のラッパーを通過する必要があるのですか? – user7552

関連する問題