5

クラスの変数名を取得したいと思います。

var Poop = new Class({ 
    getClassName: function() { 
        return arguments.callee._owner.name;
    } 
});
var a = new Poop();
a.getClassName(); //want 'Poop'

私はそれを他のクラスに実装しようとしており、テーブルのクラス名 (複数形) を使用する SQL クエリを作成したいと考えています。

上記の例のさまざまな組み合わせを試して名前を取得しようとしましたが、わかりません (MooTools クラス システムを考慮すると可能であるとしても)。

4

3 に答える 3

8

解決策を見つけました。 ハッシュには keyOf 関数があり、値を保持する変数名を取得します。そこで、ウィンドウのハッシュを作成し、クラス コンストラクターのキーを要求しました。

var Poop = new Class({
    name: function() {
        var w = $H(window);
        return w.keyOf(this.constructor);
    }
});
var a = new Poop();
a.name(); // returns 'Poop'

もちろん、これが機能するのは、(MooTools ではよくあることですが) グローバル ウィンドウ名前空間にクラスを作成するからです。いくつかの名前空間内にクラスを作成した場合は、代わりにその名前空間をハッシュするだけで済みます。

編集:興味のあるすべての MooTooler のために、このソリューションの使用方法と名前空間で自動的に機能させる方法について書きました。

于 2009-05-08T06:52:06.897 に答える
2

Extendsで問題が発生しましたが、それを回避する方法を見つけました。

var getClassNameFromKeys = function (obj, instance) {
        var i = 0, keys = Object.keys(obj);
        for (i; i < keys.length; i++) {
        if ('Ext' !== keys[i] && typeOf(obj[keys[i]]) === 'class' && instance instanceof obj[keys[i]]) {
                return keys[i];
            }
        }
    },
    Ext = new Class(),
    WhatsMyName = new Class({
        Extends: Ext
    }),
    whatsMyNameInstance = new WhatsMyName(),
    cName = getClassNameFromKeys(this, whatsMyNameInstance);

console.log(cName);

次のようなパターンに従うと、extends名のチェックを回避できます。

var O = {},
    whatsMyNameInstance;

(function () {
    var SUBCLASS_KEYS;

    O.Ext = new Class({
        _className: null,
        getClassName: function () {
            var i = 0;

            SUBCLASS_KEYS = SUBCLASS_KEYS || Object.keys(O.subclasses);

            for (i; i < SUBCLASS_KEYS.length; i++) {
            if (this instanceof O.subclasses[SUBCLASS_KEYS[i]]) {
                    return SUBCLASS_KEYS[i];
                }
        }
        }        
    });
})();

O.subclasses = {};

O.subclasses.WhatsMyName = new Class({
    Extends: O.Ext
});

whatsMyNameInstance = new O.subclasses.WhatsMyName();

whatsMyNameInstance.getClassName();
于 2012-04-04T19:42:28.653 に答える
0

言語のプロトタイプ指向の性質のため、これは Javascript では可能ではないと思います。オブジェクトが既知の既存のクラスであるかどうかを判断するには、次のようないくつかの方法があります。

if (a.constructor == Poop) {
     alert("This will work, but I don't really want any Poop.");
}

ただし、それは未知のオブジェクトのクラスを決定するためには実際には機能しません。を含むクラスをチェックするためにできるプロトタイプは他にもありますがtoString()、それらはカスタム クラスではなく、組み込みオブジェクトに対してのみ機能します。これは、MooTools に固有ではないプロトタイプ作成の欠点です。

Javascript の第 5 版である The Definitive Guideの 174 ページの 9.7 章を調べてみると、そこには素晴らしい議論があります。基本的には、カスタム クラスにclassnameプロパティを設定し、デフォルトの基本オブジェクト クラスtoString()メソッドをオーバーライドして、カスタム クラスで呼び出すときにこのプロパティをチェックすることをお勧めします。

于 2009-05-08T02:59:57.000 に答える