2010-11-07 9 views
9

Szukam utworzyć tablicę asocjacyjną w JS, ale użyj stałych zdefiniowanych jako część klasy jako indeksy.Używanie stałych jako wskaźników dla tablic asocjacyjnych JavaScript

Powodem, dla którego chcę, jest to, aby użytkownicy klasy mogli używać stałych (które definiują zdarzenia) do wyzwalania akcji.

Niektóre kodu do zilustrowania:

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; 

Mam kłopot to zadziałało. Nie jestem zbyt świetny w JS, ale wygląda na to, że bez względu na to, co robię, tablica zostanie zdefiniowana za pomocą ciągów, a nie stałych. Czy istnieje sposób zmuszenia tablicy do użycia stałych?

Dzięki!

Odpowiedz

30

Problem polega na tym, że nie można użyć wartości kluczowej części podczas definiowania obiektu dosłownie.

To znaczy, można powiedzieć tak:

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

Ale nie można powiedzieć tak:

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

JavaScript pozwala użyć "skrótów", aby określić, gdzie literały obiektowe można pominąć podwójne cudzysłowy wokół klawiszy. W związku z tym nie można tam użyć wyrażenia.

16

W ES6 można używać obliczonych wartości dla kluczy obiektów.

var CONSTANT_A = 0, CONSTANT_B = 1 
 
var state_machine = { 
 
    [CONSTANT_A]: function() { 
 
     return 'a' 
 
    }, 
 
    [CONSTANT_B]: function() { 
 
     return 'b' 
 
    } 
 
}; 
 

 
console.log(state_machine)

To nie działa w IE 11, ani w przeglądarkach Safari: https://kangax.github.io/compat-table/es6/#test-object_literal_extensions_computed_properties

+0

Dzięki! Uratowałeś mi dużo czasu. – Mihir

+0

Ah, ES6 jest świetny –

Powiązane problemy