JavaScript/クラス名を後から取得する方法 http://www.ark-web.jp/sandbox/wiki/4767.html

今までは、

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)

関数名は 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オブジェクトに参照でもあればいいんだけどな…

投稿者志田 | パーマリンク | コメント(1)

| append.gif


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-04-30 (水) 09:53:56 (1179d)

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