我想得到类的变量名。
var Poop = new Class({
getClassName: function() {
return arguments.callee._owner.name;
}
});
var a = new Poop();
a.getClassName(); //want 'Poop'
我正在将其实现到其他类中,并且我想构建一个使用表名的类名(复数)的SQL查询。
我尝试过以上示例的各种组合来尝试获取名称,并且无法弄明白(如果甚至可以考虑MooTools类系统)。
答案 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()
方法。