2010-11-07 72 views
9

我正在尋找在JS中創建關聯數組,但使用定義爲類的一部分的常量作爲索引。使用常量作爲Javascript關聯數組的索引

我想要這樣做的原因是,類的用戶可以使用常量(定義事件)來觸發操作。

一些代碼來說明:

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; 

我遇到了麻煩這項工作。我對JS不太瞭解,但看起來不管我做什麼,數組都是用字符串而不是常量來定義的。有什麼辦法強制數組使用常量?

謝謝!

回答

30

這裏的問題實際上是,當你定義一個對象字面上時,你不能使用關鍵部分的值。

也就是說,你可以這樣說:

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

但你不能這樣說:

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

JavaScript允許您使用「速記」定義對象的文字,你可以省略鍵周圍的雙引號。因此,你不能在那裏使用表達式。

16

在ES6中,您可以使用對象鍵的計算值。

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

 
console.log(state_machine)

這並不在IE 11也沒有在Safari瀏覽器上運行: https://kangax.github.io/compat-table/es6/#test-object_literal_extensions_computed_properties

+0

謝謝!你爲我節省了很多時間。 – Mihir 2016-06-19 08:40:18

+0

啊,ES6太棒了 – 2016-09-30 15:28:37

相關問題