Задать значение переменной, а потом запретить ее перезаписывать
var deck = (function(){ var massOfCards = []; // здесь заполняем массив return massOfCards; //Ошибка! })(); Object.defineProperty(window, "deck", { writable: false, configurable: false, }); Мне показывает ошибку, нельзя присваивать значение свойству read only. Без выкрутасов с Object.defineProperty все работает. В чем подвох? Object.defineProperty выполняется заранее? Если да, то как лучше реализовать задачу? |
"defineProperty", он декларирует свойство, а не устанавливает флаги:
Object.defineProperty(window, "deck", { writable: false, configurable: false, value: (function(){ var massOfCards = []; // здесь заполняем массив return massOfCards; })() });Если пользуетесь современным javascript, то можно и так: const deck = (function(){ var massOfCards = []; // здесь заполняем массив return massOfCards; //Ошибка! })(); Только одна мелочь: содержимое массива всё равно вы сможете менять, защищаете от перезаписи вы только саму переменную. |
Цитата:
Чтобы решить "мелочь", нужно в цикле аналогично продекларировать каждое свойство (элемент)? |
Цитата:
const deck = (function(){ var massOfCards = []; // здесь заполняем массив return Object.freeze(massOfCards); })(); Но следует помнить, что каждый вложенный объект придётся замораживать отдельно. P.S. Вообще в js практически нет задач где действительно бы стоило морозить значения. |
Цитата:
|
SvetozarPNZ,
У вас нет ошибки там где Вы показали, все нормально работает. У Вас ошибка возникает при попытке присваивания где то ниже, скорей всего |
fuckingquest, хз хз, надо спеку смотреть. Ибо по описанию - значение value по умолчанию должно быть undefined. То что это работает, ещё ничего не значит.)
|
Aetae,
то что я нашел, говорит об обратном: Функция defineProperty применяется для добавления нового собственного свойства и/или добавления атрибутов уже существующего собственного свойства объекта. http://es5.javascript.ru/x15.2.html#x15.2.3.6 |
fuckingquest, ок. MDN не так ясно об этом говорит. Всё же define - это define, потому вводит в заблуждение.)
|
Aetae,
это о многом можно сказать, вообще характерно для синт. сахара современных ЯП. Например выражение function(){}, на самом деле, адекватно бы выглядело как f = function create; f.setArguments() f.setBody(); f.setLexicalEnvironment() я уж не говорю о function declaration касаемо define, кстати, оператор присваивания в JS выполняет роль и define(определения) и set(присваивания) Слишком много подковерной возни в современных ЯП, это проблема |
Часовой пояс GMT +3, время: 10:30. |