2012-09-26 12 views
14

JavaScript le ofrece muchas formas de declarar objetos. Cuando se tiene la mayoría de los datos disponibles en la mano, el más conveniente (en mi opinión) es el siguiente:Sintaxis de declaración de objeto JavaScript - nombres de variable como propiedades

var person = { 
    name: 'John', 
    age: 23 
}; // "object literal syntax" 

Algo extraño de esta sintaxis es que es idéntica a ésta:

var person = { 
    'name': 'John', 
    'age': 23 
}; // "object literal syntax" 

Es decir, puede usar comillas u omitirlas para los nombres de las propiedades.

Al comparar eso al establecimiento de un único funciona la propiedad manera, usted tiene dos opciones:

person.birthday = "January 12"; // "dot syntax" 

o

person['birthday'] = "January 12"; // "array syntax" 

El "sintaxis punto" sólo funciona cuando el operando de la derecha es la real nombre de la propiedad. Si desea utilizar una variable para el nombre de la propiedad, usted tiene que utilizar "la sintaxis de matrices", es decir:

var prop = "birthday"; 
person[prop] = "January 12"; 

Ahora, es posible el uso de una variable para el nombre de la propiedad en el "objeto de sintaxis literal" ? Como no importa si cita los nombres de las propiedades, no parece haber una forma obvia de usar una variable allí. Estoy buscando algo como esto:

var prop = "birthday"; 
var person = { 
    name: 'John', 
    age: 23, 
    (prop): 'January 12' 
}; 

Aquí estoy usando (prop) como la sintaxis imaginario utilizado para expresar que se trata de una variable y no una cadena literal.

Gracias.

+0

creo que tendrá que atenerse a la sintaxis de matrices .. tal vez eval (+ prop +' = "Enero 12 "') hará el truco, pero no creo que esta sea la solución óptima –

+1

@PhilippeBoissonneault - ¡Ack! Eval * no * es necesario ... no lo use en este contexto. –

+0

Está buscando el equivalente de las variables de variable PHP: '$ foo = bar; $ bar = '123'; echo $$ foo; // en realidad muestra '123'' – Ray

Respuesta

3

ES6 permite ahora esto: '. persona

var obj = { 
    [prop]: 'value' 
}; 
7

No, esto no funcionará, por eso, si está configurando dinámicamente nombres de propiedades, se sugiere y utiliza una notación similar a una matriz.

var k='propertyname'; 
object[k]="value"; 

Esto funciona al utilizar la notación de puntos para establecer el índice o el nombre de propiedad de vatiable no es posible.

+0

Creo que se prefiere la frase "notación de corchetes", pero en caso contrario, sí. –

2

No se puede hacer esto con los objetos, pero si se tiene en cuenta el uso de una función constructora En cambio, podría ser algo como esto:

var prop = "birthday"; 
var Person = function() { 
    this.name = "Bob"; 
    this[prop] = "January 12"; 
}; 
var bob = new Person(); 

Por supuesto que todavía tiene la notación de matriz aquí, pero tal vez le gustaría este abordaje de todos modos :)

4

para las personas que necesitan una gota en el reemplazo de la sintaxis con punto donde las claves son objetos en lugar de cadenas (digamos para anidar dentro de un objeto padre), he aquí algunas soluciones:

var developers = { 
    person: { 
     'name': 'John', 
     'age': 23 
    }, 
    anarchist: (function(){ var a = {}; 
     a['name'] = 'John'; 
     a['age'] = 23; 
     a[false] = false; 
     a[1] = 1; 
     a[window] = window; 
    return a; })(), 
    conformist: _.object([ 
     ['name', 'John'], 
     ['age', 23], 
     [false, false], 
     [1, 1], 
     [window, window] 
    ]) 
}; 

// console.log(developers); // <- to see var dump in Firebug 

El elemento anarquista usa self-executing-function que obtiene la basura recogida después de la llamada, y el elemento conformist usa la función _.object() si puede incluir underscore.js en su sitio.

Me gustaría que las funciones incorporadas de Object() y Array() permitieran pasar llaves y valores de la manera subrayado.js lo hace :-)

+0

una caída en las funciones de auto-llamada es definitivamente mi solución preferida +1 – Fydo

Cuestiones relacionadas