Во-первых, я рекомендую переместить объявление класса в IIFE .Это очищает код, делает его более автономным и позволяет использовать локальные переменные, не загрязняя глобальное пространство имен.Ваш код становится:
var Foo = (function() {
function Foo() {
}
Foo.CONSTANT1 = 1;
Foo.CONSTANT2 = 2;
return Foo;
})();
Проблема с присвоением констант непосредственно классу в качестве атрибутов заключается в том, что они доступны для записи.Посмотреть этот фрагмент:
var output = document.getElementById("output");
var Foo = (function() {
function Foo() {
}
Foo.CONSTANT1 = 1;
Foo.CONSTANT2 = 2;
return Foo;
})();
Foo.CONSTANT1 = "I'm not very constant";
output.innerHTML = Foo.CONSTANT1;
<div id="output"></div>
Лучшее решение, которое я нашел, - это определение свойств только для чтения для доступа к константам вне класса.
var output = document.getElementById("output");
var Foo = (function() {
const CONSTANT1 = "I'm very constant";
function Foo() {
}
Object.defineProperty(Foo, "CONSTANT1", {
get: function() {
return CONSTANT1;
},
});
return Foo;
})();
Foo.CONSTANT1 = "some other value";
output.innerHTML = Foo.CONSTANT1;
<div id="output"></div>
(Технически вы можете отказаться от оператора const CONSTANT1
и просто вернуть значение из определения свойства, но я предпочитаю это, потому что это упрощает просмотр всехконстанты с первого взгляда.)