今までは、
 
  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(志田)
 - animal.Human.nameで"Human"が取得でき、animal.Humanのインスタンスのconstructorプロパティからanimal.Humanを参照できます。 -- [[javascripter]] &new{2009-09-07 (月) 16:37:27};
 - arguments.callee.name でも取得できるような --  &new{2014-04-30 (水) 09:53:55};
 
 #comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

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