Почему невозможно присвоить константные свойства объектам JavaScript с помощью ключевого слова const?

Во-первых, я спросил, возможно ли это: Как создать константы Javascript как свойства объектов с помощью ключевого слова const?

Теперь я должен спросить: почему? Ответ мне кажется «просто потому что», но было бы очень полезно сделать что-то вроде этого:

var App = {};  // want to be able to extend
const App.goldenRatio= 1.6180339887  // throws Exception

Почему константы, установленные для объекта активации, могут работать, но не могут работать, если они установлены для любого другого объекта?

Какой ущерб можно было бы нанести, если бы это было возможно?

Какова цель const, если не предотвращение изменения общедоступного API?


person danronmoon    schedule 01.06.2012    source источник
comment
Дело не в том, что можно нанести ущерб. Конечно, многие языки предлагают эту конструкцию. Дело в том, что JavaScript не предлагает такой конструкции.   -  person Eric J.    schedule 01.06.2012
comment
Насколько я понимаю здесь, const не является стандартным, даже если некоторые браузеры могут его использовать (не IE). У меня никогда не было случая, когда мне нужно было это в JS в любом случае... Вы все еще можете следовать соглашению ВСЕХ ЗАГЛАВНЫХ РЕГИСТРОВ, и большинство разработчиков поймут, что это константа.   -  person elclanrs    schedule 01.06.2012
comment
Является ли философия языкового дизайна частью Stack Overflow? Есть много причин, по которым можно исключить такие функции из языка, но я подозреваю, что в данном случае это потому, что язык был довольно поспешно выброшен за дверь, с прикрепленным как можно большим количеством синтаксических штучек Java-y, чтобы связать два в противном случае- родственные языки вместе в маркетинговых целях.   -  person Mark Reed    schedule 01.06.2012


Ответы (4)


Отвечу на вопрос, который вы хотели задать, и скажу: никогда не используйте const. Интерпретатор ничего с ним не делает. Все, что он делает, это вводит разработчика в заблуждение, заставляя думать, что он может предположить, что значение никогда не изменится, что примерно так же вероятно, как если бы ключевое слово const не присутствовало.

person djechlin    schedule 01.06.2012

Если вам нужно неизменяемое значение в современном браузере, используйте defineProperty чтобы создать свойство, недоступное для записи (также известное как доступное только для чтения):

var App = {};
Object.defineProperty(App,'goldenRatio',{value:1.6180339887});
console.log( App.goldenRatio ); // 1.6180339887
App.goldenRatio = 42;
console.log( App.goldenRatio ); // 1.6180339887
delete App.goldenRatio;         // false
console.log( App.goldenRatio ); // 1.6180339887

Если вы не передадите writable:true в параметрах defineProperty, по умолчанию будет установлено значение false, и, таким образом, любые изменения, которые вы попытаетесь изменить, игнорируются. Кроме того, если вы не передадите configurable:true, по умолчанию будет использоваться false, и вы не сможете удалить свойство.

person Phrogz    schedule 01.06.2012

Помимо того факта, что const поддерживается и не поддерживается в разных браузерах (это функция ES6), const App.goldenRatio= 1.6180339887 не работает по той же причине, что и var App.goldenRatio= 1.6180339887: вы устанавливаете свойство объекта, поэтому его добавление в начале является синтаксической ошибкой. с ключевым словом var или const.

person bfavaretto    schedule 19.02.2013

var MY_CONSTANT = "какое-то значение"; Вы можете использовать такие соглашения, как ALL_CAPS, чтобы показать, что определенные значения не следует изменять.

person Axesh Ajmera    schedule 01.06.2012