2009-05-08 19 views
5

Me gustaría obtener el nombre de variable de la clase.Cómo obtener el nombre de una clase Mootools desde

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

estoy haciendo que se pondrá en práctica en otras clases, y me gustaría construir una consulta SQL que utiliza el nombre de clase (pluralizado) para la tabla.

He intentado varias combinaciones del ejemplo anterior para tratar de obtener el nombre, y no puedo encontrarlo (si es posible teniendo en cuenta el sistema de clases MooTools).

Respuesta

8

Encontró una solución. Hash has a keyOf function, que me dará el nombre de la variable que contiene un valor. Así que hice una Hash of window y luego pedí la clave del constructor de la clase.

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

Por supuesto, esto sólo funciona porque creo clases del espacio de nombres global de la ventana (como es común con MooTools). Si ha creado clases dentro de algún espacio de nombres, entonces solo necesita Hash ese espacio de nombres en su lugar.

Editar: I wrote up sobre cómo usar esta solución y cómo hacer que funcione en espacios de nombres automáticamente, para cualquier MooToolers interesado.

0

No creo que esto sea posible en Javascript, debido a la naturaleza del lenguaje orientada a prototipos. Hay varias cosas que puede hacer para determinar si un objeto es de una clase existente que ya sabe, como por ejemplo:

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

Sin embargo, eso no funciona muy bien para la determinación de la clase de un objeto desconocido. Hay otras cosas prototipo que puede hacer para verificar la clase que implica toString(), pero solo funcionan para objetos incorporados, no para clases personalizadas, y esto es un inconveniente de la creación de prototipos que no es específico de MooTools.

Si consulta 5th Edition of Javascript, The Definitive Guide, página 174, capítulo 9.7, hay una buena discusión allí. Básicamente, la recomendación es rellenar sus clases personalizadas con una propiedad classname y anular el método predeterminado de clase de objeto toString() para verificar esta propiedad cuando la está llamando en una clase personalizada.

2

me encontré con un problema con Extiende, pero encontró una manera de evitarlo:

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

Puede evitar el registro de entrada se extiende en el nombre si usted sigue un patrón algo como esto:

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(); 
Cuestiones relacionadas