2012-06-15 10 views
5

私はジャバスクリプトのコアのいずれかの方法で書き換えています書き直された現在実行中の関数の名前を取得する:Javascriptのメタプログラミング:動的

Element.prototype._removeChild = Element.prototype.removeChild; 
Element.prototype.removeChild = function(){ 
    callback(); 
    this._removeChild.apply(this,arguments); 
} 

私は動的に(この場合は「のremoveChild」で)メソッドの名前を取得したいです関数の内部から動的に書き換えられます。私はarguments.callee.nameを使用していますが、それは単なる匿名の機能だと思って何も返しません。匿名関数に割り当てられている関数の名前を取得するにはどうすればよいですか?

+4

Javascriptがメソッドを持っていません。プロパティに割り当てられた関数のみ。この場合、 'Element.prototype.removeChild'は割り当てられた一つのプロパティです。同時に他の場所に割り当てることもできます。関数の名前ではなく、名前もありません。この関数は、割り当てられているプロパティの数や割り当てられているプロパティを認識しません。 – Esailija

答えて

5

は、匿名機能であるです。 Element.prototype.removeChildプロパティにこの匿名関数を割り当てるだけで、そのプロパティをその関数の名前にすることはできません。同じ関数を多くの変数やプロパティに割り当てることができ、呼び出された名前を知る方法はありません。

ただし機能あなたがarguments.callee.nameとしてアクセスすることができ、適切な名前を付けることができます:

Element.prototype.removeChild = function removeChild() { 
    .... 
} 
+0

ahhhhは100%の意味を持ちます。ありがとう! – user730569

+1

+1これは関数が 'removeChild'によって参照される可能性があるので完璧ですが、' removeChild'はまだ関数の外側では未定義です。 JavaScriptを正しく実装していないIE 8以降は例外です。 IE 8では、 'removeChild'の下では、全体の周りにクロージャをラップしないかぎり、外側のスコープ(グローバルな可能性があります)にさらされています:'(function(){Element.prototype.removeChild = function removeChild(){...}) (); ' – Paulpro

+0

関数に名前を与えたので、廃止された' arguments.callee'の代わりにその名前を使うことができます。しかし、もう一度、 'removeChild.name' ...:P – Esailija

関連する問題