2017-09-16 56 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. 

從這個示例代碼,我應該怎麼修改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

我得到一個'Uncaught SyntaxError:Unexpected token ='。當然,這是有效的JS? –

+1

對不起,我將添加打字稿標記 – user7552

+0

關於更新,請使用'call'而不是'bind'。 –

回答

1

您可以使用bind來設置默認參數(字符串"special: ")。所以這應該工作:

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

說明:

specialLog被調用,傳遞給console.log的第一個參數總是會"Special: ",所以如果你把它想:

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

+0

感謝您的幫助,請檢查更新3.爲什麼我需要它通過另一個包裝。 – user7552