如何从内部获取Mootools类的名称

时间:2009-05-08 00:39:50

标签: javascript mootools

我想得到类的变量名。

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

我正在将其实现到其他类中,并且我想构建一个使用表名的类名(复数)的SQL查询。

我尝试过以上示例的各种组合来尝试获取名称,并且无法弄明白(如果甚至可以考虑MooTools类系统)。

3 个答案:

答案 0 :(得分:8)

找到解决方案。 Hash has a keyOf function,它将为我提供包含值的变量名称。所以我创建了一个Hash of window,然后询问了类构造函数的关键字。

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

这当然有效,因为我在全局窗口命名空间中创建了类(与MooTools一样)。如果您在某个命名空间内创建了类,那么您只需要改为使用Hash该命名空间。

编辑:I wrote up关于如何使用此解决方案以及如何使其在名称空间中自动运行,适用于任何感兴趣的MooToolers。

答案 1 :(得分: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);

如果您遵循以下模式,则可以避免检查扩展名:

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();

答案 2 :(得分:0)

我认为这不可能在Javascript中,因为该语言的原型导向性质。您可以采取以下措施来确定对象是否属于您知道的现有类,例如:

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

但是,这并不能确定未知对象的类。您还可以使用其他原型来检查涉及toString()的类,但它们仅适用于内置对象,而不适用于自定义类,这是原型设计的一个缺点,而不是特定于MooTools。

如果你看看5th Edition of Javascript, The Definitive Guide,第174页,第9.7章,那里有一个很好的讨论。基本上建议使用classname属性填充自定义类,并在自定义类上调用此属性时覆盖默认的基类Object toString()方法。