今までは、
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