2011-04-13 8 views
6

Me gustaría obtener un objeto de su nombre en Javascript. Estoy trabajando en una aplicación que tendrá que cargar un contexto diferente, estoy tratando de cargar diferentes clases con el plugin jquery "inherit". Todo funciona bien, excepto que, cuando necesito instanciar una clase, no puedo porque solo tengo el nombre de la clase y no el objeto directamente.Obtener la clase de objeto del nombre de cadena en javascript

Básicamente, me gustaría encontrar algo como 'getClass (String name)'. ¿Alguien podría ayudarme?

+0

Ok, eso es estúpido, pero utilizando el 'eval()' función en el nombre de mi objeto hacer el truco ... Lo siento por este post inútil ... – Celero

Respuesta

10

No utilice eval().

Se podría almacenar sus clases en un mapa:

var classes = { 
    A: <object here>, 
    B: <object here>, 
    ... 
}; 

y luego simplemente mirar hacia arriba:

new classes[name]() 
+0

¿Por qué el uso de 'eval() ' Está Mal ? No puedo hacerlo así, mis "clases" son genéricas y deben cargarse en un contexto particular, no puedo cargar un mapa como este ... – Celero

+0

@Celero: Porque 'eval()' se puede usar para ejecutar código arbitrario que puede ser un riesgo de seguridad. Proporciona mucha más potencia de la que necesita. ¿Por qué no puedes usar un mapa? ¿Qué quieres decir con genérico y de qué contexto estás hablando? Si proporciona más información, podemos hacerlo mejor. –

+0

Estaba muy equivocado, tus trucos se pueden aplicar cuando sea necesario. Gracias ! – Celero

5

JavaScript: Call Function based on String:

function foo() { } 
this["foo"](); 
+0

Esto, básicamente, hacer lo mismo que eval(), no? – Celero

+0

@ Celero - no. Ejecutar como código global, * this * hará referencia al objeto gobal/window por lo que es equivalente a * window ['foo'] *. Si lo está utilizando dentro de otro ámbito, es posible que no tenga idea de qué * este * hace referencia. ** No ** hace referencia a la variable del alcance o al objeto de activación (es decir, el contexto de ejecución), que es lo que desea, ya que se encuentra en la parte superior de los objetos en la cadena de resolución variable. – RobG

+0

Ok, gracias por su precisión. – Celero

0

¿Quieres decir esto?

function Person(name){ 
    this.name = name; 
} 

function getClass(str_name, args){ 
    return new (window[str_name])(args); 
} 

var wong2 = getClass("Person", "wong2"); 

alert(wong2.name); // wong2 
+0

No, tengo mucha clase con herencia entre algunos de ellos, solo necesito cargar uno de ellos a la vez en un caso específico. Es por eso que eval() está bien para mí ... – Celero

+0

@celero ¿podría dar un ejemplo? tal vez un poco de código? – wong2

+0

Lo siento, no puedo, de todos modos voy a probar las técnicas de Felix Kling y ver ... Gracias por su ayuda – Celero

Cuestiones relacionadas