2009-07-14 62 views
10

Tôi đang thiết kế một số lớp và đối với một số dữ liệu tôi muốn sử dụng các trường không đổi.Cách tạo hằng số trong javascript

Bây giờ, Như thường lệ, IE không hỗ trợ const chìa khóa để

const T = 10; 

không hoạt động.

tôi có thể tạo ra một tài sản qua __defineGetter____defineSetter__ để diễn tả bằng điệu đó nhưng , Như thường lệ, IE không hỗ trợ cú pháp (IE 8 có Object.defineProperty nhưng không hoạt động trên đối tượng tùy chỉnh).

Bất kỳ ý tưởng nào?

Trả lời

11

"Không giải pháp" thực sự là giải pháp an toàn nhất. Ngay bây giờ không có một cơ chế tốt để tạo hằng số trong Javascript, nhưng nếu bạn thiết lập một quy ước (ALL CAPS FOR CONSTS) để giúp xác định chúng và không ghi đè lên chúng thì hằng số của riêng bạn sẽ an toàn.

Nếu bạn đang viết một thư viện công cộng và bạn đang thực sự lo lắng về một người nào đó sửa đổi một giá trị sau đó bạn có thể sử dụng một biến tư nhân chỉ truy cập đến mã riêng của bạn bằng cách kiểm soát phạm vi với một chức năng:

(function() { 
    var MY_CONSTANT = 42; 
    alert(MY_CONSTANT); // alerts "42" 
    ...do other stuff in here... 
})(); 
alert(MY_CONSTANT); // alerts "undefined" because MY_CONSTANT is out of scope here 

Nếu một nhà phát triển có thể đọc một giá trị trong javascript thì nhà phát triển đó có thể sửa đổi giá trị đó.

+0

có cách tương thích trình duyệt chéo duy nhất để xác định một loại hằng số là sử dụng các bao đóng và cung cấp các phương thức để truy cập biến đó (như thể nó có biến riêng ...). Nhưng vấn đề của tôi là cung cấp cho người dùng nhà phát triển để nhận giá trị từ một hằng số dưới dạng obj.MY_CONSTANT để giải pháp sau của bạn không phù hợp. Vì vậy, cuối cùng, cho rằng (IE cũng là 8 vers.) Trình duyệt khủng khiếp và không tương thích, chúng tôi phát triển luôn phải tìm giải pháp kém và lãng phí thời gian của chúng tôi. Khi M $ hiểu rằng nhà phát triển web muốn TIÊU CHUẨN ????? – xdevel2000

+0

Tôi thường sẽ không phản đối khi ai đó muốn khiếu nại về M $ và tiêu chuẩn, nhưng trong trường hợp này có vẻ không công bằng vì hằng số javascript không phải là một phần của bất kỳ đặc tả nào, chúng là Mozilla cụ thể. – Prestaul

+0

Có, nhưng tôi đã liên quan đến 'chuẩn de facto' và const, __defineGetter__, v.v. được hỗ trợ cho ví dụ: bởi công cụ webKit (Chrome, v.v.). Ngoài ra đối tượng XMLHttpRequest không phải là một tiêu chuẩn w3C (nó được phát minh bởi M $) nhưng nó đã được chấp nhận bởi tất cả. – xdevel2000

2

Lưu ý rằng xác định thứ gì đó dưới dạng hằng số thực sự chỉ đảm bảo rằng nó không thể bị ghi đè.

Nếu bạn thực sự không thể xác định một cái gì đó như là một hằng số, những gì về chỉ cần xác định nó như là một biến và thiết lập giá trị của nó một lần. Tôi cho rằng bạn đang viết mã, vì vậy bạn có thể đảm bảo rằng bạn không ghi đè mã đó ...

Không rõ ràng lý tưởng, nhưng nó sẽ hoạt động.

4

Có một phương thức freeze() trong Javascript có thể được sử dụng để tạo các hằng số thực tế.

Cách sử dụng:

var consts = {};     // Object to store all constants 
    consts.MY_CONSTANT= 6; 
    Object.freeze(consts);    // Make the consts truly read only 
    consts.MY_CONSTANT= 7;    // Trying to do this will give error 
5

Object.defineProperty là những gì bạn muốn.

Ví dụ:

var obj = {}; 

Object.defineProperty(obj, 'key', { 
    enumerable: false, 
    configurable: false, 
    writable: false, 
    value: 'static' 
}); 

Wil định nghĩa "obj.key" với giá trị: "tĩnh" và nó sẽ chỉ đọc.

  • Có nghĩa là số sẽ hiển thị (hoặc không) khi liệt kê các thuộc tính của đối tượng.
  • Có nghĩa là có thể ghi nếu bạn muốn nó chỉ đọc, bạn nói sai. không thể ghi.
  • Có thể định cấu hình sai nếu bạn không muốn nó có thể bị xóa khỏi đối tượng.

Về bản chất, bằng cách đặt tất cả chúng thành sai, bạn đang tạo các hằng số trên đối tượng. Btw, giá trị mặc định của chúng là sai.

Vì vậy, hiệu quả làm việc này:

Object.defineProperty(obj, 'property', { value: 'value'}); 

Sẽ tạo ra một hằng số trên 'obj' gọi là 'tài sản' với 'giá trị' giá trị. Hoặc bạn có thể làm điều này

function setConstant(obj, key, value) 
{ 
    Object.defineProperty(obj, key, {value: value }); 
} 

var obj = {}; 
setConstant(obj, "constantName", "constantValue"); 

Làm cho nó dễ đọc.

1

Cũ câu hỏi nhưng ngày nay bạn có thể chỉ đơn giản là sử dụng:

const MY_CONST = 10; 

Từ MDN:

Việc kê khai const tạo ra một tham chiếu chỉ đọc đến một giá trị. Nó không có nghĩa là giá trị mà nó nắm giữ là không thay đổi được, chỉ là việc định danh biến không thể được gán lại.

Supported by tất cả các trình duyệt chính đã có.

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