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

找到了解决方案。 Hash 有一个 keyOf 函数,它会给我保存一个值的变量名。于是我做了一个window的Hash,然后求类构造函数的key。

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

当然,这只是因为我在全局窗口命名空间中创建了类(这在 MooTools 中很常见)。如果您在某个命名空间中创建了类,那么您只需要对那个命名空间进行散列即可。

编辑:对于任何感兴趣的 MooToolers,我写了关于如何使用这个解决方案以及如何让它在命名空间中自动工作的文章。

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

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

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 版,权威指南,第 174 页,第 9.7 章,那里有一个很好的讨论。基本上,建议是使用属性填充自定义类,并在自定义类上调用它时classname覆盖默认的基 Object 类方法以检查此属性。toString()

于 2009-05-08T02:59:57.000 回答