2012-06-08 11 views
19

Duplicar posible:
Javascript use variable as object nameJavascript: interpretar cadena como referencia de objeto?

¿Cómo llego JS tratar a una cadena como una referencia a un objeto previamente definido? Simplificado:

var myObject = new MyObject(); 

var myString = "myObject"; 

var wantThisToWork = myString.myproperty; 
+1

Si esto es lo que cree que necesitará, entonces no utilizar variables para su almacenamiento. Almacene 'myObject' dentro de otro objeto utilizado como espacio de nombre global. 'var my_namespace = {}; my_namespace.myObject = new MyObject(); var myString = "myObject"; var itWorks = my_namespace [myString] .myproperty' –

+0

@amnotiam Mi respuesta detalla de qué está hablando su comentario, es difícil de entender por un comentario. –

+0

@ j08691 La respuesta aceptada en esa publicación es muy hackish. No lo usaría –

Respuesta

6

La única forma, como me parece, sería usar eval. Pero como dicen, eval es malvado, pero no en entornos controlados. Esta es la forma en que es posible, pero no recomiendo usar eval, a menos que sea absolutamente necesario.

var myObject = new MyObject(); 
var myString = "myObject"; 
var wantThisToWork = eval(myString).myproperty; 
+0

y ¿por qué fue ese voto a favor? no me digas por eval Ya mencioné que no lo recomiendo a menos que sea absolutamente necesario. –

+1

No creo que esto merezca un voto negativo. Hay casos en los que tiene que usar 'eval' (si está intentando acceder a una variable local). –

+0

exactamente! Y con esta expresión no me refiero a que la situación de OP (me pregunto cuál es la forma completa de OP) es una en la que esto es necesario. Pero además de repetirlo varias veces que no usa eval innecesariamente, ¿para qué sirve ese voto? –

7

Puede usar la función eval.

eval(myString).myproperty 

Cuidado con eval, sin embargo, si esto es algo que el usuario está insertando, se ejecutará cualquier código JavaScript!

+0

Hay formas mejores (que otros mencionaron), no use 'eval' si no tiene que hacerlo al –

+0

Sí, sé que eval no debe usarse a menos que sea absolutamente necesario y acabo de verlos. ¡No sabía de eso! +1 a esas respuestas. – sachleen

23

Si la variable está en el ámbito mundial, se puede acceder a él como una propiedad del objeto global

var a = "hello world"; 
var varName = "a"; 
console.log(window[varName]); // outputs hello world 
console.log(this[varName]); // also works (this === window) in this case 

Sin embargo, si se trata de una variable local, la única manera es utilizar eval (disclaimer)

function() { 
    var a = "hello world"; 
    var varName = "a"; 
    console.log(this[varName]); // won't work 
    console.log(eval(varName)); // Does work 
} 

a menos que usted puede poner sus variables dinámicas en un objeto y acceder a ella como una propiedad

function() { 
    var scope = { 
    a: "hello world"; 
    }; 
    var varName = "a"; 
    console.log(scope[varName]); // works 
} 
+0

buena explicación.Estoy un poco confundido sobre por qué no podemos usar la palabra clave 'Function' en este caso. http://stackoverflow.com/questions/36078655/extract-call-javascript-function-defined-in-the-onclick-html-attribute-of-an-e –

+0

@ techie_28 Puedes, solo tienes que estar cuidado con la ejecución de código arbitrario, al igual que 'eval'. Por lo general, es mejor evitarlo si es posible. –

+0

'Función (onclickB.replace (" p, q "," p, q, r "))' esto funciona bien cuando 'onclickB' es de la forma' return someFunc (2, 'abc') 'pero cuando extraer solo el nombre de la función, es decir, cuando 'onclickB = 'someFunc'', pasarlo a' Function (onclickB) .call (....) 'no llama a la función y da un error ... ¿estoy haciendo algo estúpido aquí? –

4

Uso eval()

var myObject = {}; 
myObject.myproperty = "Hello"; 
var myString = "myObject"; 

var wantThisToWork = eval(myString).myproperty; 
+3

¿No fueron suficientes las respuestas de ** ** **? Esto es exactamente lo que di. –

+1

No vuelva a publicar respuestas existentes, ya hubo 3 respuestas como la suya cuando la agregó. No se agregó valor a la publicación. –

+0

@ParthThakkar: Mientras escribía mi respuesta y la vez que la publiqué, ya se publicaron muchas respuestas. De alguna forma, la notificación de la respuesta ya publicada no llegó (Internet lento). ¿Qué te hizo pensar que estoy interesado en lo que escribiste? – Anand

Cuestiones relacionadas