2009-05-08 2 views
5

Я хотел бы получить имя переменной класса.Как получить имя класса Mootools изнутри

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

Делаю, которые будут реализованы в другие классы, и я хотел бы построить запрос SQL, который использует имя класса (множественном) для таблицы.

Я пробовал различные комбинации приведенного выше примера, чтобы попытаться получить имя и не могу понять его (если это возможно даже с учетом системы классов MooTools).

ответ

8

Найдено решение. 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' 

Это, конечно, работает только потому, что я создаю классы в глобальном пространстве имен окна (как это часто бывает с MooTools). Если вы создали классы внутри некоторого пространства имен, тогда вам просто нужно Хэшировать это пространство имен.

Редактировать: I wrote up о том, как использовать это решение и как заставить его работать в пространствах имен автоматически, для любых заинтересованных пользователей MooToolers.

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 class toString(), чтобы проверить это свойство, когда вы вызываете его в пользовательском классе.

2

я столкнулся с проблемой, с Расширяет, но нашел путь вокруг него:

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(); 
Смежные вопросы