2011-05-21 19 views
72

Quiero usar el valor de una variable para acceder a un objeto.Variable de uso de Javascript como nombre de objeto

Digamos que tengo un objeto llamado myobject.

Quiero llenar una variable con este nombre y usar la variable para acceder al objeto.

Ejemplo:

var objname = 'myobject'; 
{objname}.value = 'value'; 

Respuesta

100

global:

myObject = { value: 0 }; 
anObjectName = "myObject"; 
this[anObjectName].value++; 

console.log(this[anObjectName]); 

global: v2

var anObjectName = "myObject"; 
this[anObjectName] = "myvalue" 

console.log(myObject) 

Local: v1

(function() { 
    var scope = this; 

    if (scope != arguments.callee) { 
     arguments.callee.call(arguments.callee); 
     return false; 
    } 

    scope.myObject = { value: 0 }; 
    scope.anObjectName = "myObject"; 
    scope[scope.anObjectName].value++; 

    console.log(scope.myObject.value); 
})(); 

local: v2

(function() { 
    var scope = this; 

    scope.myObject = { value: 0 }; 
    scope.anObjectName = "myObject"; 
    scope[scope.anObjectName].value++; 

    console.log(scope.myObject.value);  
}).call({}); 
+0

@Shaz: Ha! ¿Qué tan inteligente ... – PeeHaa

+0

@Shaz - ambos hacen referencia al mismo alcance en realidad ;-) (Asumiendo que se ejecutan en un navegador) 'alerta (esta === ventana)'. –

+0

@Sean: Ellos son. Y lo hacen? – PeeHaa

6

¿Es una variable global? Si es así, estos son realmente parte del objeto window, por lo que puede hacer window[objname].value.

Si es local para una función, no creo que haya una buena manera de hacer lo que quiera.

5

No se puede hacer esto en general, excepto en el ámbito de la ventana, donde se puede escribir window[objname].value = 'value';

5

Usted podría utilizar eval:

eval(variablename + ".value = 'value'"); 
+0

¿No se considera 'eval'' evil'? Si no, podría usarlo. Porque ahora es global pero quería moverlo a una función para limpiar cosas. – PeeHaa

+1

Lol. Si el nombre de la variable proviene de la entrada del usuario, asegúrese de validarlo, de modo que no contenga ningún código JS que 'eval' pueda ejecutar. – Midas

+0

@Midas: no proviene directamente de la entrada del usuario. Pero a partir del contenido de datos de un elemento HTML. Que el usuario por supuesto puede manipular. Sin embargo, no veo qué hay de malo si el usuario puede ejecutar su propio código JS. Solo se ejecuta en el cliente o me falta algo? – PeeHaa

7

el objeto existe en un cierto margen, por lo que casi siempre se puede acceder a la variable a través de esta sintaxis :

var objname = "myobject"; 
containing_scope_reference[objname].some_property = 'some value'; 

El único lugar donde esto se pone complicado es cuando se encuentra en un ámbito cerrado y desea acceder a una variable local de nivel superior. Cuando se tiene algo como esto:

(function(){ 
    var some_variable = {value: 25}; 
    var x = "some_variable"; 
    console.log(this[x], window[x]); // Doesn't work 
})(); 

Usted puede moverse por que mediante el uso eval en lugar de acceder a la cadena de ámbito actual ... pero no lo recomendaría a menos que usted ha hecho un montón de pruebas y usted sabe que esa es la mejor manera de hacer las cosas.

(function(){ 
    var some_variable = {value: 25}; 
    var x = "some_variable"; 
    eval(x).value = 42; 
    console.log(some_variable); // Works 
})(); 

Su mejor apuesta es tener una referencia a un nombre en una siempre-va-a-ser-ahí objeto (como this en el ámbito global o una variable de nivel superior privada en un ámbito local) y poner todo más allí.

Por lo tanto:

var my_outer_variable = {}; 
var outer_pointer = 'my_outer_variable'; 
// Reach my_outer_variable with this[outer_pointer] 
// or window[outer_pointer] 

(function(){ 
    var my_inner_scope = {'my_inner_variable': {} }; 
    var inner_pointer = 'my_inner_variable'; 
    // Reach my_inner_variable by using 
    // my_inner_scope[inner_pointer] 
})(); 
3

creo que la respuesta de Shaz como variables locales es difícil de entender, aunque funciona para funciones no recursivas. Aquí hay otra forma en que creo que es más claro (pero sigue siendo su idea, exactamente el mismo comportamiento). Tampoco está accediendo dinámicamente a las variables locales, solo la propiedad de la variable local.

En esencia, se trata de utilizar una variable global (que se adjunta al objeto de función)

// Here's a version of it that is more straight forward. 
function doIt() { 
    doIt.objname = {}; 
    var someObject = "objname"; 
    doIt[someObject].value = "value";  
    console.log(doIt.objname); 
})(); 

que es esencialmente lo mismo que la creación de un mundial para almacenar la variable, por lo que puede acceder a ella como una propiedad. Crear un global para hacer esto es un hack.

Aquí hay un truco más limpio que no crea variables globales, sino que usa una variable local.

function doIt() { 
    var scope = { 
    MyProp: "Hello" 
    }; 
    var name = "MyProp"; 
    console.log(scope[name]); 
} 

Ver Javascript: interpret string as object reference?

0

Cuando se utiliza la ventana [objname], por favor asegúrese de que el objname es variables globales. De lo contrario, funcionará en algún momento y algunas veces fallará. ventana [nombre_obj] .valor.

0

Si el objeto está en algún espacio de nombre, es decir. Company.Module.Components.Foo puede utilizar esta función:

CoffeeScript:

objByName: (name, context = window) -> 
    ns = name.split "." 
    func = context 
    for n, i in ns 
     func = func[n] 
    return func 

Resultó Js:

objByName: function(name, context) { 
    var func, i, n, ns, _i, _len; 
    if (context == null) { 
    context = window; 
    } 
    ns = name.split("."); 
    func = context; 
    for (i = _i = 0, _len = ns.length; _i < _len; i = ++_i) { 
    n = ns[i]; 
    func = func[n]; 
    } 
    return func; 
} 

continuación, puede crear un nuevo objeto o lo que sea. Tenga en cuenta el parenthises a través de.

var o = new (objByName('Company.Module.Components.Foo')) 
objByName('some.deeply.nested.object').value 

Esta idea está tomada de pregunta similar: How to execute a JavaScript function when I have its name as a string

-1
var micro=[{'test':'hello'}]; 

var device = 'test'; 

console.log(micro[device]); 
3

uso de corchetes en torno a nombre de la variable.

var objname = 'myobject'; 
{[objname]}.value = 'value'; 
Cuestiones relacionadas