代码之家  ›  专栏  ›  技术社区  ›  seanmonstar

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

  •  5
  • seanmonstar  · 技术社区  · 16 年前

    我想知道类的变量名。

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

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

    我尝试了上述示例的各种组合,试图获取名称,但无法找到它(如果考虑到mooolts类系统是可能的话)。

    3 回复  |  直到 13 年前
        1
  •  8
  •   seanmonstar    16 年前

    找到了解决方案。 Hash has a keyOf function ,它将为我提供保存值的变量名。所以我对窗口进行了散列,然后请求类构造函数的键。

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

    当然,这仅仅是因为我在全局窗口名称空间中创建了类(与mooolts相同)。如果在某个名称空间内创建类,那么只需散列该名称空间即可。

    编辑: I wrote up 关于如何使用这个解决方案以及如何使它在名称空间中自动工作,对于任何感兴趣的mootooler。

        2
  •  2
  •   javascriptjedi    13 年前

    我遇到了一个扩展问题,但找到了一种解决方法:

    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();
    
        3
  •  0
  •   zombat    16 年前

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

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

    但是,这对于确定未知对象的类并不真正有效。你还可以做一些其他的原型工作来检查涉及 toString() 但是它们只适用于内置对象,而不是自定义类,这是原型化的一个缺点,而原型化并不是特定于moootools的。

    如果您查看 5th Edition of Javascript, The Definitive Guide 第174页,第9.7章,有一个很好的讨论。基本上,建议使用 classname 属性,并重写默认的基对象类 托斯特林() 方法在自定义类上调用此属性时检查它。