Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.11.2016, 22:42
Интересующийся
Отправить личное сообщение для SvetozarPNZ Посмотреть профиль Найти все сообщения от SvetozarPNZ
 
Регистрация: 26.10.2010
Сообщений: 16

Задать значение переменной, а потом запретить ее перезаписывать
var deck = (function(){
	var massOfCards = [];

        // здесь заполняем массив

	return massOfCards;	//Ошибка!
})();

Object.defineProperty(window, "deck", {
	writable: false,
	configurable: false,
});


Мне показывает ошибку, нельзя присваивать значение свойству read only. Без выкрутасов с Object.defineProperty все работает.
В чем подвох? Object.defineProperty выполняется заранее?
Если да, то как лучше реализовать задачу?
Ответить с цитированием
  #2 (permalink)  
Старый 05.11.2016, 22:49
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

"defineProperty", он декларирует свойство, а не устанавливает флаги:
Object.defineProperty(window, "deck", {
    writable: false,
    configurable: false,
    value: (function(){
        var massOfCards = [];
     
            // здесь заполняем массив
     
        return massOfCards;
    })()
});
Если пользуетесь современным javascript, то можно и так:
const deck = (function(){
    var massOfCards = [];
 
        // здесь заполняем массив
 
    return massOfCards; //Ошибка!
})();


Только одна мелочь: содержимое массива всё равно вы сможете менять, защищаете от перезаписи вы только саму переменную.
__________________
29375, 35

Последний раз редактировалось Aetae, 05.11.2016 в 22:52.
Ответить с цитированием
  #3 (permalink)  
Старый 05.11.2016, 22:57
Интересующийся
Отправить личное сообщение для SvetozarPNZ Посмотреть профиль Найти все сообщения от SvetozarPNZ
 
Регистрация: 26.10.2010
Сообщений: 16

Сообщение от Aetae Посмотреть сообщение
Только одна мелочь: содержимое массива всё равно вы сможете менять, защищаете от перезаписи вы только саму переменную.
Спасибо. Получается в первую очередь сработал defineProperty.

Чтобы решить "мелочь", нужно в цикле аналогично продекларировать каждое свойство (элемент)?
Ответить с цитированием
  #4 (permalink)  
Старый 05.11.2016, 23:09
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

Сообщение от SvetozarPNZ Посмотреть сообщение
Чтобы решить "мелочь", нужно в цикле аналогично продекларировать каждое свойство (элемент)?
Для объектов(в js масивы тоже объекты) есть "Object.freeze()". Т.е.:
const deck = (function(){
    var massOfCards = [];
  
        // здесь заполняем массив
  
    return Object.freeze(massOfCards); 
})();

Но следует помнить, что каждый вложенный объект придётся замораживать отдельно.

P.S. Вообще в js практически нет задач где действительно бы стоило морозить значения.
__________________
29375, 35
Ответить с цитированием
  #5 (permalink)  
Старый 06.11.2016, 01:20
Аспирант
Отправить личное сообщение для fuckingquest Посмотреть профиль Найти все сообщения от fuckingquest
 
Регистрация: 28.10.2016
Сообщений: 70

Сообщение от Aetae
"defineProperty", он декларирует свойство, а не устанавливает флаги:
Судя по поведению, если св-во уже существует, он просто установит флаги уже существующему св-ву, поэтому, таки, устанавливает флаги.
Ответить с цитированием
  #6 (permalink)  
Старый 06.11.2016, 01:23
Аспирант
Отправить личное сообщение для fuckingquest Посмотреть профиль Найти все сообщения от fuckingquest
 
Регистрация: 28.10.2016
Сообщений: 70

SvetozarPNZ,
У вас нет ошибки там где Вы показали, все нормально работает. У Вас ошибка возникает при попытке присваивания где то ниже, скорей всего
Ответить с цитированием
  #7 (permalink)  
Старый 06.11.2016, 01:31
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

fuckingquest, хз хз, надо спеку смотреть. Ибо по описанию - значение value по умолчанию должно быть undefined. То что это работает, ещё ничего не значит.)
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 06.11.2016, 01:40
Аспирант
Отправить личное сообщение для fuckingquest Посмотреть профиль Найти все сообщения от fuckingquest
 
Регистрация: 28.10.2016
Сообщений: 70

Aetae,
то что я нашел, говорит об обратном:

Функция defineProperty применяется для добавления нового собственного свойства и/или добавления атрибутов уже существующего собственного свойства объекта.

http://es5.javascript.ru/x15.2.html#x15.2.3.6
Ответить с цитированием
  #9 (permalink)  
Старый 06.11.2016, 01:54
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

fuckingquest, ок. MDN не так ясно об этом говорит. Всё же define - это define, потому вводит в заблуждение.)
__________________
29375, 35

Последний раз редактировалось Aetae, 06.11.2016 в 01:58.
Ответить с цитированием
  #10 (permalink)  
Старый 06.11.2016, 02:38
Аспирант
Отправить личное сообщение для fuckingquest Посмотреть профиль Найти все сообщения от fuckingquest
 
Регистрация: 28.10.2016
Сообщений: 70

Aetae,
это о многом можно сказать, вообще характерно для синт. сахара современных ЯП. Например выражение function(){}, на самом деле, адекватно бы выглядело как f = function create; f.setArguments() f.setBody(); f.setLexicalEnvironment()
я уж не говорю о function declaration

касаемо define, кстати, оператор присваивания в JS выполняет роль и define(определения) и set(присваивания)

Слишком много подковерной возни в современных ЯП, это проблема

Последний раз редактировалось fuckingquest, 06.11.2016 в 02:47.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Значение переменной для задания имени InfoDusha Общие вопросы Javascript 6 29.12.2014 06:17
Как задать значение параметру div Atom686 Events/DOM/Window 4 12.10.2014 12:26
Не передается значение "глобальной" переменной в php-скрипт mosoft02 Events/DOM/Window 9 07.10.2013 12:19
Выводить значение раньше переменных Гробовщик Общие вопросы Javascript 11 10.09.2013 08:42
Как задать начальное значение Cusel zebulun jQuery 1 07.07.2012 13:01