次のプログラムを想定します。
var SomeConstructor = function() { };
var instance = = new SomeConstructor ();
表現 instance instanceof SomeConstructor
はTrueを生成するため、instance
は関数SomeConstructor
によって構築されたことを何らかの方法で知る必要があります。 SomeConstructor
から直接instance
という名前を取得する方法はありますか?
(私の手元の問題では、アプリケーションで可能な信号を実装するプロトタイプの階層があります。その信号を作成するために使用されるコンストラクターと同等の信号のタイプにアクセスする必要があります。)
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
を返すことができるかどうかを確認するだけです。
このコードは、無名関数でない限り、コンストラクターの名前を取得します。
obj.constructor.toString().match(/function (\w*)/)[1];
なぜクラス名が必要なのですか? JSONを介してクラスインスタンスを保存および復元するとします。クラス名を「type」プロパティに保存し、JSON.parseのリゾルバー関数を使用してオブジェクトを復元できます。 (サンプルコード このページ を参照)。
したがって、理論的には、上記のコードを使用して、任意のクラスインスタンスを処理できる汎用シリアライザを作成できますが、ファンクション文字列の解析は非常に非効率的です。このオーバーヘッドは、格納するすべてのクラスにタイプを明示的に提供するよう要求することで回避できます。
function Foo() {}
Foo.prototype.type = 'Foo';
これはばかげて冗長なようです。そのため、クラス名を暗黙的に取得するための探求を始めました。しかし、結局私は譲らなければなりません:JSには許容できる解決策はありません:-(
いいえ。_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
クラスを次のように宣言することもできます:
var C = function C() { };
これでC
クラスコンストラクターは名前付き関数になり(匿名関数ではなくなりました)、次のことが可能になります。
x = new C();
console.log(x.constructor.name); // output: C
コンストラクターを知る必要があるこのコードは、コンストラクター関数自体にアクセスできますか?もしそうなら、あなたはそのinstanceof事をすることができます。
名前でそれを知る必要があるようです。これは危険に聞こえます。誰かが偶然同じ名前を持つ別のコンストラクタを作成すると、それが渡されます(もちろん、それが必要な場合を除きます)。