web-dev-qa-db-ja.com

JavaScriptでコンストラクターの名前を取得する方法は?

次のプログラムを想定します。

var SomeConstructor = function() { };
var instance = = new SomeConstructor ();

表現 instance instanceof SomeConstructorはTrueを生成するため、instanceは関数SomeConstructorによって構築されたことを何らかの方法で知る必要があります。 SomeConstructorから直接instanceという名前を取得する方法はありますか?

(私の手元の問題では、アプリケーションで可能な信号を実装するプロトタイプの階層があります。その信号を作成するために使用されるコンストラクターと同等の信号のタイプにアクセスする必要があります。)

29
Marc

Chrome(7.0.544.0 dev))の場合:

function C() { }

var x = new C();

console.log(x.constructor.name);

'C'を出力します...しかし、Cが無名の関数として定義されている場合は、代わりに空の文字列を出力します。

印刷した場合x.constructor使用しているコードでCを出力した場合と同じように出力します。 instanceof演算子は、これら2つの値を比較して、trueを返すことができるかどうかを確認するだけです。

31
sje397

このコードは、無名関数でない限り、コンストラクターの名前を取得します。

obj.constructor.toString().match(/function (\w*)/)[1];

なぜクラス名が必要なのですか? JSONを介してクラスインスタンスを保存および復元するとします。クラス名を「type」プロパティに保存し、JSON.parseのリゾルバー関数を使用してオブジェクトを復元できます。 (サンプルコード このページ を参照)。

したがって、理論的には、上記のコードを使用して、任意のクラスインスタンスを処理できる汎用シリアライザを作成できますが、ファンクション文字列の解析は非常に非効率的です。このオーバーヘッドは、格納するすべてのクラスにタイプを明示的に提供するよう要求することで回避できます。

function Foo() {}
Foo.prototype.type = 'Foo';

これはばかげて冗長なようです。そのため、クラス名を暗黙的に取得するための探求を始めました。しかし、結局私は譲らなければなりません:JSには許容できる解決策はありません:-(

9
phatmann

いいえ。_x.constructor_を使用してCへの直接参照を取得できますが、これは匿名関数であるため、名前を取得する方法はありません。

そのように定義された場合:

_function C() { };
x = new C();
_

次に、x.constructor.toString()を使用して、返された文字列から関数の名前を解析することができます。一部のブラウザは_x.constructor.name_もサポートします[1]

[1] https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/name

3
Andy E

クラスを次のように宣言することもできます:

var C = function C() { };

これでCクラスコンストラクターは名前付き関数になり(匿名関数ではなくなりました)、次のことが可能になります。

x = new C();    

console.log(x.constructor.name); // output: C
2
Wilt

コンストラクターを知る必要があるこのコードは、コンストラクター関数自体にアクセスできますか?もしそうなら、あなたはそのinstanceof事をすることができます。

名前でそれを知る必要があるようです。これは危険に聞こえます。誰かが偶然同じ名前を持つ別のコンストラクタを作成すると、それが渡されます(もちろん、それが必要な場合を除きます)。

0
RichN