2009-05-08 21 views
5

Mi piacerebbe ottenere il nome della variabile della classe.Come ottenere il nome di una classe Mootools da

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

sto facendo che saranno applicate in altre classi, e mi piacerebbe costruire una query SQL che utilizza il nome della classe (pluralizzato) per la tabella.

Ho provato varie combinazioni dell'esempio precedente per provare a ottenere il nome e non riesco a capirlo (se è possibile anche considerando il sistema di classe MooTools).

risposta

8

Trovato una soluzione. Hash has a keyOf function, che mi darà il nome della variabile che contiene un valore. Così ho creato una finestra di hash e poi ho chiesto la chiave del costruttore della classe.

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

Questo ovviamente funziona solo perché creo classi nella finestra namespace globale (come è comune con MooTools). Se hai creato delle classi all'interno di uno spazio dei nomi, devi semplicemente eseguire l'hashing di tale spazio dei nomi.

Modifica: I wrote up su come utilizzare questa soluzione e come farlo funzionare automaticamente in spazi dei nomi, per qualsiasi MooTooler interessato.

0

Non credo sia possibile in Javascript, a causa della natura orientata al prototipo della lingua. Ci sono diverse cose che potete fare per determinare se un oggetto è di una classe esistente che si sa, come ad esempio:

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

Tuttavia, che non funziona davvero per determinare la classe di un oggetto sconosciuto. Esistono altri prototipi che è possibile eseguire per verificare la classe che coinvolge lo standard toString(), ma funzionano solo per gli oggetti incorporati, non per le classi personalizzate e questo è un inconveniente della prototipazione non specifica di MooTools.

Se si controlla il 5th Edition of Javascript, The Definitive Guide, pagina 174, capitolo 9.7, c'è una bella discussione su di esso lì. Fondamentalmente, la raccomandazione è di popolare le classi personalizzate con una proprietà classname e sovrascrivere il metodo predefinito di classe Object di base toString() per verificare questa proprietà quando la si chiama in una classe personalizzata.

2

mi sono imbattuto in un problema con Estende, ma ha trovato un modo intorno ad esso:

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

È possibile evitare il controllo sul nome si estende se si segue un modello qualcosa di simile:

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(); 
Problemi correlati