4

次のコード例を見てみましょう。

var ns = {}; // Some namespace

ns.Test = function()
{
    // Constructor of class Test
};

var inst = new ns.Test();
var className = hereIsTheMagic(inst); // Must return "ns.Test"

そこで、名前空間「ns」に「Test」という名前のクラスを作成し、「inst」という名前のこのクラスのインスタンスを作成します。今、私はクラス名を知りたいです。これどうやってするの?

inst.constructor.classNameこれまでは、クラス名にアクセスするために使用できるように、クラス名を含む文字列プロパティを各クラスに与えることで、この問題を解決していました。しかし、可能であれば、クラスをコピー/貼り付けするときにエラーが発生しやすいため、これをやめたいと思います。

現在のすべてのブラウザーで機能するソリューションがない場合、クラス名へのアクセスを提供する将来の ECMAScript 仕様に少なくともいくつかの新機能があるのでしょうか?

4

1 に答える 1

8

JavaScript にはクラスがなく、コンストラクター関数とプロトタイプ チェーンがあります。一緒にすると、クラスのように見えますが、実際にはそうではありません。:-)

いいえ、hereIsTheMagicECMAScript 5 でさえ、あなたの例で文字列 "ns.Test" を見つけることができる標準的な方法はありませns.Testns.OtherTest = ns.Test;

JavaScript には適切な名前を持つ関数の概念がありますが、関数の適切な名前にアクセスする標準的な方法はありません。たとえアクセスできたとしても、呼び出している関数ns.Testanonymousです。に割り当てたプロパティに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()

于 2011-03-16T13:45:09.377 に答える