2011-12-13 9 views
3

私は現在、より大きなオブジェクトを構築しており、デバッグ/検査/値/結果/リターンの方がより迅速で具体的になる必要があります。javascriptオブジェクトメソッド名を取得するには?

は今、私は、次のことについて考え:

var myObject = { 
    whatever: null, 
    whereever: null, 
    debug: false, 

    someFunction: function(arg) { 
     // General - would output *all* logs for all object functions. 
     // if (true === myObject.debug) 
     // console.log('FunctionNameHere', arg); 

     // More specific - would output *only* the log for the currently targeted function 
     if ('FunctionName' === myObject.debug) 
      console.log('FunctionNameHere', arg); 
    }, 
}; 

これは私が単に一つの関数名としてオブジェクトVAR debugを定義し、この部分のみをログに記録することが可能になります。

唯一の問題は、FunctionName/someFunctionをどのように取得すればよいですか?

Sidenotes:

  • console.log(arguments.callee);は私に全体の機能のソースを提供します。
  • console.log(arguments.callee.name);が空です。
  • console.log(arguments.callee.toString());戻り、私はオブジェクト全体のログに見てみるならば、私はprototype.name="Empty"と、このようなを参照してください
  • console.log(arguments.caller);戻りundefined

を空にします。だから直接オブジェクトからそれを得るチャンスはありません。

ありがとうございます!

+0

したがって、一般的に言えば、デバッグが 'true'の場合、' myObject'関数のいずれかが実行されると、関数名+引数を持つコンソールをログに記録しますか? – kubetz

+0

@dzejkej正確ではありません。関数名に 'debug'をセットすると、等しくfnという名前の' log'だけがトリガされます。これは、私が各機能にデバッグを構築し、必要な/指定されたときにそれを起動することを可能にする。 – kaiser

+0

私の回答には、ハードコーディングなしで要件に合ったコードが含まれています。それは少し進んでいますが、うまくいけば、あなたはこの興味深い言語を研究するよう動機づけるでしょう:P。 – kubetz

答えて

3

debugtrueあるとdebugは、関数の名前に設定されている場合、あなたはあなたのすべての単一の関数にこれをハードコーディングする必要はありません機能するだけでログインした場合、あなたはすべての関数を記録したい場合。

機能を動的に書き換えることができます。これは魔法のビットですが、柔軟性が非常に高く、機能を追加したり名前を変更するときに何も変更する必要はありません。

HEREは作業コードです。

+0

この機能をお寄せいただきありがとうございます。問題は(私が推測すると)私のオブジェクトはgoogle.mapsで動作するので、これはすべてを破り、latlngが途中で中断するためです。 – kaiser

+0

OK、オブジェクト内で作業しました。ありがとう - ソリューションとしてマーク。 – kaiser

1

これは名前を持たない無名関数なので、今のところそれを得ることはできません。それをサポートしているブラウザではあなたがされているブラウザに応じて、異なる方法で名前で取得することができるだろう

someFunction: function iNowHaveAName(arg) 

、あなたは:

あなたはこのようにそれを宣言した場合。 arguments.callee.nameを使用できます。あなたは例外をキャッチし、スタックトレースでそれを見つけることができていないブラウザでは

(これは高速でパフォーマンス賢明無料です):

try { 
i.dont.exist+=1; 
} 
catch(e) { 
//play with the stacktrace here 
} 

これが遅いとパフォーマンス賢明な高価である - いたしませんそれは生産コード内にあります:)

+0

'arguments.callee'は非推奨であり、JavaScriptの将来のバージョンでは削除されることに注意してください。すでにES5の厳格なモードでは利用できません。 – Phrogz

+0

私はJSで始まったばかりなので、「someFunction:function iNowHaveAName'のように名前をつけることはできませんでした。ありがとう+1 – kaiser

+1

また、バックトレースよりも名前を取得する方法があります: 'function getName(f){var match =/function(\ w +)/。exec(f +" ");リターンマッチ&&マッチ[1]; } ' – Phrogz

0

関数に名前がない場合、それを取得することはできません。 —の無名関数—には名前がありません。関数の値を参照するために1つ以上の変数またはオブジェクトのプロパティを割り当てても、その名前は付けられません。

は、これらの例を考えてみましょう:

var a = [function(){}]; 
var b = a; 
var c = a[0]; 

その単機能の "名前" とは何ですか? a[0]b[0]c?なぜ、どちらかを選ぶべきでしょうか?

JavaScriptには、特定のオブジェクト(関数を含む)へのすべての参照を要求する方法はありません。

関連する問題