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