2016-12-17 16 views
0

私はログに情報を追加するためにconsole.log関数をプロキシしています。また、ログに記録されている情報がオブジェクトであるかどうかを調べています。これは、並べ替えのログエントリを取得しないようにするためです。ブラケットの後ろに新しい行を追加する

2016-12-17 (22:12:51) > [object Object] 

コードは、オブジェクトではない引数を渡すときに問題なく動作します。例えば、コマンド

console.log("hello","world"); 

プリント

2016-12-17 (22:23:53) > hello 
2016-12-17 (22:23:53) > world 

しかし、私は同様にオブジェクトを渡す場合、コードは、オブジェクトの後に新しい行を挿入するために失敗します。たとえば、コマンドが

console.log("hello",{world:true,hello:{amount:1,text:"hello"}},"world"); 

プリント

2016-12-17 (22:27:32) > hello 
2016-12-17 (22:27:32) > { world: true, hello: { amount: 1, text: hello } } 2016-12-17 (22:27:33) > world 

(オブジェクトを表示した後、行方不明の改行を注意してください)。

コード

のjQuery 3.1.1

main.js:

(function (proxied) { 
    function displayArg(argument){ 
     var result= ""; 
     if(typeof argument == "object") { 
      result += "{ "; 
      for (i in argument) { 
       result += i + ": "; 
       result += (displayArg(argument[i])); 
       result += ", " 
      } 
      result = result.substring(0,result.length - 2); 
      result += " }"; 
      return result; 
     } else { 
      return argument; 
     } 
    } 

    console.log = function() { 
     var result = []; 
     for (i in arguments) { 
      var d = new Date(); 
      result[i] = d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate() + 
       " (" + d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds() + ") > "; 
      result[i] += displayArg(arguments[i]); 
      result[i] += "\n"; 
     } 
     return proxied.apply(this, result); 
    } 
})(console.log); 

答えて

0

TL; DRは、彼らが名前を共有しないように、イテレータ変数を変更したり、彼らはあなたの希望の範囲をエスケープしていないことを確認するループ定義に「VAR」を追加し

それは(私自身)はconsole.logdisplayArgからループの「共有」イテレータ私の値だったことが判明します。これは、反復子変数を宣言しないと、スコープが必要な範囲よりも広かったためです。明確にするために、この例を見て:

console.log({isThis:"real life"},"hello","world") 

にconsole.logからコードが結果の先頭に[0]を日付を追加し、displayArg(引数[0])を呼び出します、 引数[0]{isThis: "actual life"}です。その関数は、オブジェクトのプロパティを反復処理します。したがって、にはisThisという値が割り当てられます。関数が返された後、の値はに戻りません。に戻りません。その代わり、は私isThisとなり、結果として、ライン

result[i] += "\n"; 

result[isThis] += "\n" 

の代わりに、おそらく最も賢明な解決策を追加することでした

result[0] += "\n" 

に変換しますa varは、イテレータの宣言用です。次のコードは期待通りに機能します:

0

私は完全には理解客観ないんだが、何の線に沿って何かについてオーバーライドオーバーライドオーバーライドの後:

var oldLog = console.log; 

console.log= function(){ 
    var d= new Date(), 
     dateString = // process string 

    ..... 
    for(var i = 0; i<arguments.length; i++){ 
     oldLog(dateString, arguments[i]);   
    } 

} 
+0

引数ごとに前の定義を呼び出す可能性を分析しました。それは新しい行の処理を節約します。実際には、1回の呼び出しではなく、引数(result [i])ごとに関数を呼び出すことは、自分のコードから難しいことではありません。しかし、コードではconsole.logから返された情報が使用され、ユーザーが一度だけ呼び出すと内部的に数回呼び出すと、ソリューションよりも複雑になる可能性があります。 – Emilio

関連する問題