2009-08-23 8 views
3

、これら両者を比較:javascriptで名前空間のコンストラクタの関数名を見つける方法は?例えば

function Person(name) { 
this.name = name; 
} 
var john = new Person('John'); 
console.log(john.constructor); 
// outputs: Person(name) 

var MyJSLib = { 
Person : function (name) { 
    this.name = name; 
} 
} 
var john2 = new MyJSLib.Person('John'); 
console.log(john2.constructor); 
// outputs: function() 

最初のフォームは、実行時にデバッグのために有用です。 2番目のフォームでは、オブジェクトの種類を把握するためにいくつかの追加ステップが必要です。

私は、記述的なtoString関数を書​​くことができ、あるいはより多くの情報を得るためにコンストラクタのtoSourceメソッドを呼び出すことができますが、私は可能な限り簡単な方法を望んでいます。

これを行う方法はありますか?提案?

答えて

6

まあ以下のコードを試してください。

あなたは、(はい、それは奇妙に聞こえる)無名関数の名前を可能性が指定できます。

var MyJSLib = { 
Person : function Person (name) { 
    this.name = name; 
} 
} 
var john2 = new MyJSLib.Person('John'); 
console.log(john2.constructor); 

無名関数を命名することができますが、それらの名前は、機能そのもの内でのみ見える であり、あなたが使用しているため新しい演算子、コンストラクタのプロパティが設定され、その名前を見ることができます。

はまた、機能の名前を使用したりしませコンストラクタの参照を比較することもできます。これは絶対に与えられたコードキースBentrupでは動作しません

console.log(john2.constructor === MyJSLib.Person); // true 
+0

+1、thx!私はそれを試していない、と私は仮定していた(間違って)そのフォームは、グローバル名前空間にPersonコンストラクタを導入するだろう。知っておいてよかった。 –

+0

匿名関数は理由のために匿名です:このプロパティ割り当ての右手側にあるのは単なる関数式です(これは定義によりオプションの識別子を持つことができます) – kangax

-1

あなたが望むものは、名前空間の所有者の名前です。

function getName(namespace, obj) { 
    for name in namespace: 
    if (namespace[name] == obj) return name; 
} 
console.log(getNameOf(MyJSLib, john2.constructor)); 
+0

。それが機能するには、再帰的にルックアップする必要があります。それは非常に遅いでしょう。 – BYK

+0

名前空間変数が何であれウィンドウを変更します。ここで再帰的なものはありません。 –

+0

それは良い方法ではありません。そして、私が言ったことを読んでください:それはそうではありませんが、 "それは再帰的であるべきです"。 – BYK

3

オブジェクトが特定のクラスのインスタンスかどうかを確認するには、単に "instanceof"キーワードを使用してチェックします。あなたが明示的に(私は本当にポイントを見ることができない)コンストラクタの名前をしたい場合、あなたは匿名関数を使用しているので起こり

var MyJSLib = { 
Person : function Person(name) { 
    this.name = name; 
} 
} 
+0

-1を説明してもらえますか? – BYK

+0

john2 instanceof MyJSLib.Personがtrueを返します。しかし、私はOPが特定の名前に対してテストしたくないと思う。 –

+0

まあ私はちょうど私の後にそれを送ったCMSの答えと同じ2番目の答えを与えた。ありがとう仲間... – BYK

関連する問題