2010-11-07 34 views
9

Tôi đang tìm cách tạo một mảng liên kết trong JS, nhưng sử dụng hằng số được định nghĩa là một phần của lớp như chỉ mục.Sử dụng các hằng số làm chỉ mục cho các mảng kết hợp Javascript

Lý do tôi muốn điều này là để người dùng của lớp có thể sử dụng hằng số (xác định sự kiện) để kích hoạt hành động.

Một số mã để minh họa:

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; 

Tôi đang gặp khó khăn này để làm việc. Tôi không quá tuyệt vời với JS, nhưng có vẻ như không có vấn đề gì tôi làm, mảng được xác định bằng các chuỗi và không phải là hằng số. Có cách nào để buộc các mảng để sử dụng các hằng số?

Cảm ơn!

Trả lời

30

Vấn đề ở đây, thực tế là bạn không thể sử dụng giá trị cho phần khóa khi bạn định nghĩa một đối tượng theo nghĩa đen.

Đó là để nói, bạn có thể nói điều này:

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

Nhưng bạn không thể nói điều này:

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

JavaScript cho phép bạn sử dụng một "viết tắt" để xác định đối tượng trực nơi bạn có thể bỏ qua các dấu ngoặc kép xung quanh các phím. Như vậy, bạn không thể sử dụng một biểu thức ở đó.

16

Trong ES6 bạn có thể sử dụng giá trị được tính cho khóa đối tượng.

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

 
console.log(state_machine)

này không làm việc trong IE 11 cũng không phải trong trình duyệt Safari: https://kangax.github.io/compat-table/es6/#test-object_literal_extensions_computed_properties

+0

Cảm ơn! Bạn đã cứu tôi rất nhiều thời gian. – Mihir

+0

Ah, ES6 thật tuyệt vời –

Các vấn đề liên quan