2015-11-03 63 views
0

下我想要裝飾的console.log輸出Node.js下像以下代碼定製/裝飾的console.log Node.js的

var console = { 
    log: function(text) { 
     global.console.log('Test: ' + text); 
    } 
}; 

console.log('custom console is here'); 

輸出:

​​

然而,如果刪除了var之前變量console,

console = { 
    log: function(text) { 
     global.console.log('Test: ' + text); 
    } 
}; 

console.log('custom console is here'); 

輸出將是

custom console is here

我知道console將成爲全局變量時var被刪除。根據我的理解,它將覆蓋global.console,但似乎沒有。 爲什麼global.console不能被覆蓋?

第二個問題:有沒有更好的方法來定製console.log?

+0

我想你必須明確地定義它:'global.console = ..',而不是'console = ..' – hindmost

+0

1.如果您想要更好的日誌,請使用util.log。 2.你採取參數的方式對於你想要的是不好的,你現在只能記錄1個參數,而console.log需要多個指定的參數。 – baao

回答

1

爲什麼global.console不能被覆蓋?

因爲它是only a getter(加載console module)的訪問器屬性。
嘗試嚴格的模式,你的任務將拋出。

它可以通過使用Object.defineProperty覆蓋,但這是一個非常糟糕的主意,因爲許多模塊依賴於它。

有沒有更好的方法來定製console.log

不,console變量是你的模塊本地似乎是最好的主意。

當然你可以改進你的實現,例如,正確處理多個參數,成爲實際的Console實例(使用所有方法),或者通過require("my-console.js")可用,以便您可以在多個模塊中使用它。

1

正如其他人提到的那樣,覆蓋console.log函數並不是一個好主意,因爲許多模塊都依賴於它。

除此之外,在您的代碼中,您只將控制檯變量設置爲一個全新的對象,只有函數log,此函數只能處理1個參數,而console.log可以處理多個參數。

如果你真的想重寫功能,你可以試試這個:

function decorateLog(string) { 
    var originalFunc = console.log; 
    console.log = function(){ 
     originalFunc.apply(console, [string].concat([].slice.call(arguments))) 
    } 
} 

decorateLog('Test:') 

console.log('custom console is here'); //=> Test: custom console is here 
console.log('foo', 'bar'); //=> Test: foo bar 

但如果你只是需要更好的調試日誌,請嘗試debug包。