コンソール ロガーを再びカプセル化することを考え、コンソールをカプセル化するオブジェクト全体を考え出す代わりに、コンソール メソッドを受け取る関数を作成しました。次に、デバッグがオンになっているかどうかを確認し、関数を呼び出します。
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 プロトタイプに を追加します。log 関数と同じように名前が違うだけなので、「重複」はありません。これで、任意のオブジェクトがそのフラグを呼び出し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 拡張機能を正しくセットアップしない限り、全員のロギングも強制終了されます ;) *デバッグを示すある種のオブジェクト/ライブラリ構成を咳払いします