今までは、

 var animal = new Object();
 animal.Human = function (name) {
     this.name = name;
 }

のように、クラス定義&コンストラクタを書いてたけど、

 var animal = new Object();
 animal.Human = function Human(name) {
     this.name = name;
 }
 var className = animal.Human.toString().
                             match(/function[ ]+([a-zA-Z0-9_]+)/)[1];
 console.log(className); // Human と表示される

のようにすると、

参考: [[Function コンストラクタか関数宣言か関数式か(関数 - MDC)>https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Functions#Function_.e3.82.b3.e3.83.b3.e3.82.b9.e3.83.88.e3.83.a9.e3.82.af.e3.82.bf.e3.81.8b.e9.96.a2.e6.95.b0.e5.ae.a3.e8.a8.80.e3.81.8b.e9.96.a2.e6.95.b0.e5.bc.8f.e3.81.8b]]

 関数名は Function の toString メソッド によってシリアライズした時にも
 見る事ができます。 

とあるように、FunctionのtoString()を使って、後からクラス名がとれる。

ただ、通常は、名前空間オブジェクトも使って、

 var animal = new Object();
 
 animal.Human = function (name) {
     this.name = name;
 }
のようにしてるので、パッケージ名もほしかったら

 var animal = new Object();
 
 animal.Human = function aminal_Human(name) {
     this.name = name;
 }
のように、パッケージはアンダーバー区切りにするなどし、

 var packageAndClassName = animal.Human.toString().match(/function[ ]+([a-zA-Z0-9_]+)/)[1];
 var packages = packageAndClassName.split('_'); 
 var className = packages.pop(); 
 console.log(packages); // ["animal"] と表示される
 console.log(className);  // Human と表示される

のようにする必要があるのか。PHP4みたいでダサいが。

ただ、いずれにしても、生成したインスタンスがどのクラスのインスタンスか、わからない。
このままだとせいぜい、クラスメソッドのthisオブジェクトから、現在実行しているクラス名がわかる程度。
インスタンスからクラスのFunctionオブジェクトに参照でもあればいいんだけどな…

#blikifooter(志田)

#comment

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

アークウェブのサービスやソリューションはこちら