2009-07-14 1 views
10

Я разрабатываю несколько классов, и для некоторых данных я хочу использовать постоянные поля.Как создать константу в javascript

Теперь КАК ОБЫЧНО, IE не поддерживает ключ сопзЬ так

const T = 10; 

не работает.

я мог бы создать свойство мим, что но , КАК ОБЫЧНО, IE не поддерживает этот синтаксис через __defineGetter__ и __defineSetter__ (IE 8 имеет Object.defineProperty, но не работает на пользовательском объекте).

Любая идея?

ответ

11

«Нет решения» - действительно безопасное решение. Сейчас нет хорошего механизма для создания констант в Javascript, но если вы установите соглашение (ВСЕ ЗАДАЧИ ДЛЯ КОНСТРУКЦИЙ), чтобы помочь идентифицировать их и не перезаписывать их самостоятельно, тогда ваши собственные константы будут в безопасности.

Если вы пишете публичную библиотеку, и вы действительно беспокоитесь о ком-то изменяющего значение, то вы можете использовать частную переменную только доступную для вашего собственного кода, контролируя область с функцией:

(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 

Если разработчик может прочитать значение в javascript, после чего разработчик может изменить это значение.

+0

Да, единственный совместимый с кросс-браузером способ определения своего рода констант - использовать закрытие и предоставлять методы для доступа к этой переменной (как если бы у нее была приватная переменная ...). Но моя проблема заключалась в том, чтобы предоставить разработчику возможность получать значение из константы как obj.MY_CONSTANT, чтобы ваше последнее решение не соответствовало. Итак, в конце, для этого (IE также 8 вер.) Ужасных и несовместимых браузеров мы, разработчик, всегда должны находить плохое решение и тратить наше время. Когда M $ поймет, что веб-разработчик хочет СТАНДАРТЫ ????? – xdevel2000

+0

Обычно я не возражаю, если кто-то хочет жаловаться на M $ и стандарты, но в этом случае это кажется несправедливым, потому что константы javascript не являются частью какой-либо спецификации, они специфичны для Mozilla. – Prestaul

+0

Да, но я был связан с «стандартным де-факто» и const, __defineGetter__ и т. Д. Поддерживаются, например. двигателями webKit (Chrome и т. д.). Объект XMLHttpRequest не является стандартом w3C (он был изобретен M $), но он был принят всеми. – xdevel2000

2

Обратите внимание, что определение чего-то как константы действительно просто гарантирует, что его нельзя перезаписать.

Если вы действительно не можете определить что-то как константу, то просто определите ее как переменную и задайте ее значение один раз. Я предполагаю, что вы пишете код, так что вы можете убедиться, что не перезаписываете его ...

Не идеальный, очевидно, но он должен работать.

4

В Javascript есть метод freeze(), который может быть использован для создания фактических констант.

Использование:

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 является то, что вы хотите.

Для примера:

var obj = {}; 

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

Виль определить "obj.key" со значением: "статическим" и это будет только для чтения.

  • Перечислимое означает, что оно будет отображаться (или нет) при перечислении свойств объекта.
  • Writable означает, что если вы хотите, чтобы он был только для чтения, вы бы сказали false. не доступен для записи.
  • Настраивается на false, если вы не хотите, чтобы его можно было удалить из объекта.

По существу, ставя их всех в ложные, вы создаете константы на объекте. Btw, их значения по умолчанию должны быть ложными.

Так эффективно это сделать:

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

Создаст константу на «Obj» под названием «собственности» с «значение» значение. Или вы могли бы это сделать

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

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

Сделал бы это очень читаемым.

1

Старый вопрос, но в настоящее время вы можете просто использования:

const MY_CONST = 10; 

От MDN:

Конст объявление создает только для чтения ссылку на значение. Это не означает, что значение, которое оно имеет, является неизменным, просто чтобы идентификатор переменной не мог быть переназначен.

Supported by все основные браузеры уже есть.

 Смежные вопросы

  • Нет связанных вопросов^_^