Как создать константу в JavaScript - PullRequest
11 голосов
/ 14 июля 2009

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

Теперь, КАК ОБЫЧНО , IE не поддерживает ключ const, поэтому

const T = 10;

не работает.

Я мог бы создать свойство через __defineGetter__ и __defineSetter__, чтобы имитировать это, но , AS USUAL , IE не поддерживает этот синтаксис (IE 8 имеет Object.defineProperty, но не работает с пользовательским объектом).

Есть идеи?

Ответы [ 5 ]

11 голосов
/ 14 июля 2009

«Нет решения» - действительно самое безопасное решение. В настоящее время нет хорошего механизма для создания констант в 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, тогда этот разработчик может изменить это значение.

6 голосов
/ 06 января 2016

Object.defineProperty - это то, что вы хотите.

Например:

var obj = {};

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

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

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

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

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

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

Создаст константу в объекте obj, который называется property, со значением value. Или вы могли бы сделать это

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

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

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

6 голосов
/ 16 октября 2014

В 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
2 голосов
/ 14 июля 2009

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

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

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

1 голос
/ 20 мая 2016

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

const MY_CONST = 10;

От MDN :

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

Поддерживается всеми основными браузерами уже.

...