Я хочу реализовать константы в a class
, потому что именно здесь имеет смысл найти их в коде.
До сих пор я реализовал следующий обход статическими методами:
class MyClass {
static constant1() { return 33; }
static constant2() { return 2; }
// ...
}
Я знаю, что есть возможность возиться с прототипами, но многие рекомендуют против этого.
Есть ли лучший способ реализовать константы в классах ES6?
javascript
class
constants
ecmascript-6
Жером Верстринг
источник
источник
Ответы:
Вот несколько вещей, которые вы могли бы сделать:
Экспорт
const
из модуля . В зависимости от вашего варианта использования вы можете просто:И импортируйте это из модуля, где это необходимо. Или, основываясь на идее статического метода, вы можете объявить метод
static
доступа get :Таким образом, вам не понадобится скобка:
Пример Babel REPL
Тогда, как вы говорите, поскольку a
class
является просто синтаксическим сахаром для функции, вы можете просто добавить недоступное для записи свойство следующим образом:Было бы хорошо, если бы мы могли сделать что-то вроде:
Но, к сожалению, этот синтаксис свойства класса есть только в предложении ES7, и даже тогда он не позволит добавить
const
его в свойство.источник
this.defineProperty(this, 'constant1', {...})
Кажется, работает на меня.
источник
this.MyConst
внутриWhatever
экземпляра, вы всегда должны писать его так:Whatever.MyConst
Я использую
babel
и следующий синтаксис работает для меня:Пожалуйста, учтите, что вам нужен пресет
"stage-0"
.Чтобы установить это:
Обновить:
в настоящее время используют
stage-3
источник
stage-2
Object.freeze()
в классе исправить это?В этом документе говорится:
Это означает, что это намеренно так.
Может быть, вы можете определить переменную в конструкторе?
источник
Также можно использовать
Object.freeze
объект класса (es6) / function constructor (es5), чтобы сделать его неизменным:Попытка изменить класс даст вам мягкий сбой (не будет выдавать никаких ошибок, это просто не будет иметь никакого эффекта).
источник
Object.freeze()
для обеспечения неизменности, и в последнее время очень много использовал его. Только не забудьте применить это рекурсивно!Может быть, просто положить все свои константы в замороженный объект?
источник
Как сказал https://stackoverflow.com/users/2784136/rodrigo-botti , я думаю, что вы ищете
Object.freeze()
. Вот пример класса с неизменной статикой:источник
Вот еще один способ, которым вы можете сделать
Обратите внимание - порядок важен, вы не можете иметь константы выше
Использование console.log (Auto.CONSTANT1);
источник
Вы можете создать способ определения статических констант в классе, используя странную особенность классов ES6. Поскольку статика наследуется их подклассами, вы можете сделать следующее:
источник
Вы можете сделать «константы» доступными только для чтения (неизменяемыми), заморозив класс. например
источник
Если вам удобно смешивать и сопоставлять синтаксис функции и класса, вы можете объявить константы после класса (константы «отменены»). Обратите внимание, что Visual Studio Code будет пытаться автоматически отформатировать смешанный синтаксис (хотя он работает).
источник
Я сделал это.
Значение PI защищено от изменения, поскольку оно является значением, возвращаемым функцией. Вы можете получить к нему доступ через Circle.PI. Любая попытка присвоить ему просто отбрасывается на пол способом, аналогичным попытке присвоить строковый символ через [].
источник
Вы можете определить это так:
источник
Вы могли бы использовать
import * as
синтаксис. Хотя это и не класс, они являются реальнымиconst
переменными.Constants.js
index.js
источник