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

Javascript 如何从内部获取Mootools类的名称,javascript,mootools,Javascript,Mootools,我想知道类的变量名 var Poop = new Class({ getClassName: function() { return arguments.callee._owner.name; } }); var a = new Poop(); a.getClassName(); //want 'Poop' 我正在将其实现到其他类中,我想构建一个SQL查询,该查询使用表的类名(复数) 我尝试了上述示例的各种组合,试图获得名称,但无法理解(如果考虑到MooT

我想知道类的变量名

var Poop = new Class({ 
    getClassName: function() { 
        return arguments.callee._owner.name;
    } 
});
var a = new Poop();
a.getClassName(); //want 'Poop'
我正在将其实现到其他类中,我想构建一个SQL查询,该查询使用表的类名(复数)


我尝试了上述示例的各种组合,试图获得名称,但无法理解(如果考虑到MooTools类系统,这是可能的)。

我认为这在Javascript中是不可能的,因为该语言面向原型。要确定对象是否属于已知的现有类,可以执行以下操作:

if (a.constructor == Poop) {
     alert("This will work, but I don't really want any Poop.");
}
然而,对于确定未知对象的类来说,这并不真正有效。您还可以执行其他原型操作来检查涉及
toString()
的类,但它们只适用于内置对象,而不适用于自定义类,这是原型化的一个缺点,它不是特定于MooTools的

如果你查看第174页,第9.7章,这里有一个很好的讨论。基本上,建议使用
classname
属性填充自定义类,并在对自定义类调用时重写默认的基本对象类
toString()
方法以检查此属性。

找到了解决方案,这将为我提供保存值的变量名。所以我对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中很常见)。如果您在某个名称空间中创建了类,那么您只需要对该名称空间进行散列


编辑:关于如何使用此解决方案,以及如何使其自动在名称空间中工作,供感兴趣的Mootooler使用。

我遇到了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 getClassNameFromKeys=函数(obj,实例){
var i=0,keys=Object.keys(obj);
对于(i;i
如果遵循以下模式,则可以避免检查扩展名:

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();
var O={},
whatsMyNameInstance;
(功能(){
var子类_键;
O.Ext=新类({
_类名:null,
getClassName:函数(){
var i=0;
SUBCLASS_KEYS=SUBCLASS_KEYS | | Object.KEYS(O.SUBCLASS);
对于(i;i