2010-11-07 13 views
9

Estoy buscando crear una matriz asociativa en JS, pero uso las constantes definidas como parte de la clase como índices.Uso de constantes como índices para matrices asociativas de Javascript

La razón por la que deseo esto es para que los usuarios de la clase puedan usar las constantes (que definen eventos) para desencadenar acciones.

algo de código para ilustrar:

STATE_NORMAL = 0; 
STATE_NEW_TASK_ADDED = 0; 
this.curr_state = STATE_NEW_TASK_ADDED; 

this.state_machine = { 
    /* Prototype: 
    STATE_NAME: { 
     EVENT_NAME: { 
      "next_state": new_state_name, 
      "action": func 
     } 
    } 
    */ 

    STATE_NEW_TASK_ADDED : { // I'd like this to be a constant 
     this.EVENT_NEW_TASK_ADDED_AJAX : { 
      "next_state": STATE_NEW_TASK_ADDED, 
      "action" : function() {console.log("new task added");}, 
     } 
    } 
} 

// Public data members. 
// These define the various events that can happen. 
this.EVENT_NEW_TASK_ADDED_AJAX = 0; 
this.EVENT_NEW_TASK_ADDED_AJAX = 1; 

estoy teniendo problemas para conseguir que esto funcione. No soy muy bueno con JS, pero parece que no importa lo que haga, la matriz se define con cadenas y no con constantes. ¿Hay alguna forma de forzar a la matriz a usar las constantes?

Gracias!

Respuesta

30

El problema aquí, en realidad, es que no puede usar un valor para la parte clave cuando se define un objeto literalmente.

Es decir, se puede decir lo siguiente:

var CONSTANT_A = 0, CONSTANT_B = 1, CONSTANT_C = 2; 
var state_machine = {}; 
state_machine[CONSTANT_A] = { ... }; 
state_machine[CONSTANT_B] = { ... }; 

Pero no se puede decir lo siguiente:

var CONSTANT_A = 0, CONSTANT_B = 1, CONSTANT_C = 2; 
var state_machine = { CONSTANT_A: ..., CONSTANT_B: ... }; 

JavaScript le permite utilizar un "abreviada" para definir objetos literales donde puede omitir las comillas dobles alrededor de las teclas. Como tal, no puedes usar una expresión allí.

Cuestiones relacionadas