JavaScript にはクラスがなく、コンストラクター関数とプロトタイプ チェーンがあります。一緒にすると、クラスのように見えますが、実際にはそうではありません。:-)
いいえ、hereIsTheMagic
ECMAScript 5 でさえ、あなたの例で文字列 "ns.Test" を見つけることができる標準的な方法はありませns.Test
んns.OtherTest = ns.Test;
。
JavaScript には適切な名前を持つ関数の概念がありますが、関数の適切な名前にアクセスする標準的な方法はありません。たとえアクセスできたとしても、呼び出している関数ns.Test
はanonymousです。に割り当てたプロパティにns
は名前 ( Test
) がありますが、関数にはありません。
関数に名前を付けることができます:
var ns = {}; // Some namespace
(function() {
ns.Test = ns_Test;
function ns_Test() {
// Constructor of class Test
}
})();
...ツールが役立つので、これは良い考えですが、JavaScript コード自体がその名前を取得するための標準的な方法はありません。(ただし、しないns.Test = function ns_Test() { ... };
でください。動作するはずですが、関連するさまざまなバグがある ECMAScript のさまざまな実装があります。詳細については、上記のリンク先の記事を参照してください。)
更新:おそらく言ったはずです:関数の適切な名前を取得するための非ns_Test
標準的な方法があります(上記の例では)。
これらの中で最も簡単なのはname
関数インスタンスのプロパティで、次のような多くの実装でサポートされています。
- Firefox の SpiderMonkey
- クロムのV8
- Opera のエンジン (名前がわからない)
- Safari のエンジン (Safari モバイルを含む)
...したがって、alert(ns_Test.name);
「ns_Test」と警告します。しかし、これは非標準であり、JScript (Microsoft のエンジン) のどのバージョンでもサポートされておらず、IE9 で使用されているバージョンでもサポートされていません (ついにリリースされました!)。ここに簡単なテスター ページがあります: http://jsbin.com/oxuva3
繰り返しますが、これは関数の適切な名前 (上記の例を参照) であり、割り当てたプロパティの名前ではないことに注意してください。
存在しない場合は、関数オブジェクトでname
使用できます。関数オブジェクトは、関数の文字列表現を返す場合と返さない場合があります(例: "function ns_Test() { ... }")。これは完全に非標準ですが、デスクトップ ブラウザーでは一般的です。いくつかのモバイル ブラウザーでは動作しません。いずれにせよ、おそらく悪い考えです。:-)toString()