2009-05-08 20 views
5

Ich möchte den Variablennamen der Klasse zu bekommen.Wie bekomme ich den Namen einer Mootools-Klasse aus

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

ich, dass mache wird in andere Klassen implementiert werden, und ich möchte eine SQL-Abfrage erstellen, die den Klassennamen (pluralized) für die Tabelle verwendet.

Ich habe verschiedene Kombinationen des obigen Beispiels ausprobiert, um zu versuchen, den Namen zu bekommen, und kann es nicht herausfinden (wenn es sogar möglich ist, das MooTools Klassensystem betreffend).

Antwort

8

Eine Lösung gefunden. Hash has a keyOf function, die mir den Variablennamen geben wird, der einen Wert enthält. Also habe ich ein Hash-Fenster erstellt und dann nach dem Schlüssel des Klassenkonstruktors gefragt.

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

Dies funktioniert natürlich nur, weil ich Klassen im globalen Fenster Namensraum (wie bei MooTools üblich ist). Wenn Sie in einem Namespace Klassen erstellen, müssen Sie stattdessen nur diesen Namespace hashen.

Bearbeiten: I wrote up über die Verwendung dieser Lösung und wie es automatisch in Namespaces funktioniert, für alle MooToolers interessiert.

0

Ich glaube nicht, dass dies in Javascript möglich ist, aufgrund der prototyporientierten Natur der Sprache. Es gibt mehrere Dinge, die Sie tun können, um zu bestimmen, ob ein Objekt von einer vorhandenen Klasse ist, dass Sie wissen, wie:

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

jedoch, dass nicht wirklich für funktioniert eine unbekannte Objektklasse zu bestimmen. Es gibt andere prototypische Dinge, die Sie tun können, um nach Klassen zu suchen, die toString() beinhalten, aber sie funktionieren nur für integrierte Objekte, nicht für benutzerdefinierte Klassen. Dies ist ein Nachteil des Prototypings, das nicht spezifisch für MooTools ist.

Wenn Sie die 5th Edition of Javascript, The Definitive Guide, Seite 174, Kapitel 9.7 überprüfen, gibt es dort eine nette Diskussion darüber. Grundsätzlich besteht die Empfehlung darin, Ihre benutzerdefinierten Klassen mit einer classname-Eigenschaft zu füllen und die standardmäßige Objektklasse toString() der Basisklasse zu überschreiben, um diese Eigenschaft zu überprüfen, wenn Sie sie in einer benutzerdefinierten Klasse aufrufen.

2

Ich lief in ein Problem mit Verlängert, aber einen Weg darum herum gefunden:

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); 

Sie das Kontroll vermeiden können auf den Namen erweitert, wenn Sie ein Muster in etwa so folgen:

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(); 
Verwandte Themen