我考虑过再次封装控制台记录器,而不是想出一个完整的对象来封装控制台,而是创建了一个接受控制台方法的函数。然后它检查调试是否打开并调用该函数。
var debug = true;
var log = function (logFunction) {
if (debug) {
logFunction.apply(console, Array.prototype.slice.call(arguments, 1));
}
};
var check = function (canvas) {
log(console.groupCollapsed, "Initializing WebGL for Canvas: %O", canvas);
log(console.log, "cool");
log(console.groupEnd);
};
check(document.getElementById('thing'));
我确实喜欢@Aesthete 的想法,但我还不想制作封装的控制台。这里是以 jsfiddle 为例:http: //jsfiddle.net/WRe29/
debugCall
在这里,我向 Objects 原型添加了一个。与日志函数相同,只是名称不同,因此它们没有“重叠” 现在任何对象都可以调用debugCall
并检查其debug
标志。
Object.prototype.debugCall = function(logFunction)
{
if (this.debug) { logFunction.apply(console, Array.prototype.slice.call(arguments, 1)); }
};
var Thing = { debug : true /*, other properties*/ };
Thing.debugCall(console.log, "hello world");
编辑:
我最初的想法是使用一个对象作为“配置”来指示该对象是否应该记录。我已经使用了一段时间并且喜欢配置概念,但没想到每个人都会如此热衷于在他们的代码中使用配置对象以及传递给对象扩展函数的函数。因此,我采用了这个概念,转而关注功能装饰。
Function.prototype.if = function (exp) {
var exFn = this;
return function () {
if (exp) exFn.apply(this, arguments);
};
};
var debug = false;
console.log = console.log.if(debug);
console.group = console.group.if(debug);
// Console functions...
myFunction = myFunction.if(debug);
甚至有一个检查表达式的装饰函数非常简单,几乎没有必要,但我不愿意在我的代码中到处放置 if 语句。希望这可以帮助某人,甚至可能激发他们对功能装饰的兴趣。
注意:除非您正确设置了 if 扩展,否则这种方式也会终止所有人的日志记录;)*咳嗽某种类型的对象/库配置,指示调试