我想到了再次封装控制台记录器和代替未来与整个对象封装我创建了一个函数,它在一个控制台控制台方法。然后它检查调试是否打开并调用该函数。
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'));
我喜欢@ Esthete的想法,但我不想做封装的控制台。 这里是jsfiddle作为例子:http://jsfiddle.net/WRe29/
在这里,我添加一个debugCall
对象原型。相同的日志功能只是一个不同的名称,所以他们没有'重叠'现在任何对象都可以调用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语句在我的代码。希望这可以帮助某个人甚至引发他们对功能装饰的兴趣。
注意:这样同时也会杀灭记录给大家,除非你安装的扩展是否正确;)*咳嗽某种类型的对象/库配置指示调试
我会再次发布,你看看[这个](http://benalman.com/projects/javascript-debug-console-log/)? – adeneo 2013-04-10 00:21:21
@adeneo我没有看过,因为它的跨浏览器兼容,但不包括一些chromes控制台功能。如果我必须我可以延长这一点。 – 2013-04-10 00:24:04
首先,使用调试而不是控制台有点令人困惑,但它很方便,并且有一种简单的方法来禁用所有日志记录 - >'debug.setLevel(0)'和许多其他简洁的功能。只要覆盖log()函数对我来说听起来不是一个好主意! – adeneo 2013-04-10 00:26:36