ES6(以下のセンディハリムの回答に触発された):
myFunction.name
MDNの説明。2015年現在、nodejsとIEを除くすべての主要ブラウザーで動作します。
注:バインドされた関数では、これは " bound <originalName>
"になります。元の名前を取得したい場合は、「バインド済み」を取り除く必要があります。
ES5(ヴラッドの答えに触発された):
関数への参照がある場合、次のことができます。
function functionName( func )
{
// Match:
// - ^ the beginning of the string
// - function the word 'function'
// - \s+ at least some white space
// - ([\w\$]+) capture one or more valid JavaScript identifier characters
// - \s* optionally followed by white space (in theory there won't be any here,
// so if performance is an issue this can be omitted[1]
// - \( followed by an opening brace
//
var result = /^function\s+([\w\$]+)\s*\(/.exec( func.toString() )
return result ? result[ 1 ] : '' // for an anonymous function there won't be a match
}
- 私はこれについて単体テストを実行していない、または実装の違いを確認していませんが、コメントを残さない場合でも、原則的には機能するはずです。
- 注:バインドされた関数では機能しません
- 注:
caller
およびcallee
は非推奨と見なされます。
[1] これは合法であり、多くの場合、十分な構文強調表示ツールが関数名と括弧の間の空白を考慮できないため、ここに含めます。一方、ここに空白を含める.toString()の実装については知りません。そのため、省略できます。
元の質問への回答として、私は寄生継承を削除し、いくつかのより伝統的なOOP設計パターンを採用します。私はTidBits.OoJsを書いて、C ++を模倣した機能セットを備えたJavaScriptでOOPコードを快適に書きました(まだ完全ではありませんが、ほとんどの場合)。
コメントから、parent
必要な情報をコンストラクタに渡さないようにしたいと思います。従来のデザインパターンでは、依存関係を明確にして強制することは一般的には良いことだと考えられているので、そのパターンからそれを救うことはできません。
また、無名関数から離れることをお勧めします。すべてが「無名関数」として表示されるだけで、PITAのデバッグとプロファイリングのみを行い、私が認識している利点はありません。