Константы или конечные переменные в модулях Javascript - PullRequest
3 голосов
/ 21 июня 2011

Я пытаюсь написать несколько кодов, которые позволяют мне получать целочисленные значения на основе имени переменной, которую я использую. Тем не менее, я пытаюсь сделать целочисленные значения окончательным значением или что-то, что не может быть изменено. Я поместил несколько кодов ниже, что позволяет мне получать значения, как описано выше. Может кто-нибудь сказать мне, как это возможно для меня, чтобы сделать их окончательной переменной или что-то? Заранее спасибо.

(function() {

// Create the global, and also give ourselves a convenient alias for it (`mod`)
 window.MyModule = {
    RED: "#FF0000",
    BLUE: "#0000FF",
    GREEN: "#00FF00",
};

})();

alert(MyModule.RED); // #FF0000

Ответы [ 3 ]

6 голосов
/ 21 июня 2011

Отказ от ответственности: С точки зрения константы безопасности / окончательные переменные глупы.С точки зрения повышения производительности, поскольку движок js может оптимизировать его больше, я сомневаюсь, что это имеет значение.

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

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

С ES5 Object.freeze

window.MyModule = Object.freeze({
    RED: "#FF0000",
    BLUE: "#0000FF",
    GREEN: "#00FF00",
});

Вы можете (и это настоятельно рекомендуется) использовать ES5-shim для обновления старых / устаревших браузеров на соответствие.

Вы также можете просто использоватьObject.defineProperties

window.MyModule = {};
Object.defineProperties(window.MyModule, {
  RED: { value: "#FF0000" },
  BLUE: { value: "#0000FF" },
  GREEN: { value: "#00FF00" }
});

Для вышеизложенного есть хороший ярлык, используя Object.create

window.MyModule = Object.create(null, {
  RED: { value: "#FF0000" },
  BLUE: { value: "#0000FF" },
  GREEN: { value: "#00FF00" }
});

Будьте осторожны, устанавливаяпрототип на null, вы можете установить его на Object.prototype

4 голосов
/ 21 июня 2011

Лучший / единственный известный мне способ сделать это - объявить КРАСНЫЙ, СИНИЙ, ЗЕЛЕНЫЙ и т. Д. Как функции и вернуть постоянное значение, например:

window.MyModule = {
    RED: function() { return "#FF0000"; },
    BLUE: function() { return "#0000FF"; },
    GREEN: function() { return "#00FF00"; }
};

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

3 голосов
/ 21 июня 2011

Вы можете создать свойство только для чтения (т. Е. Свойство, которое имеет getter, но не setter).

Если вы используете ECMAScript5, проверьте Object.defineProperty().

Некоторые более ранние версии поддерживают object.__defineGetter__().

...