Страницы

Поиск по вопросам

понедельник, 6 мая 2019 г.

Почему присваивание значения readonly свойству не вызывает ошибки?

В JavaScript можно определить свойство, доступное только для чтения (readonly). Однако, если я пытаюсь переопределить значение такого свойства, то ничего не происходит. Значение остается прежним, но и исключение не выбрасывается.
Пример кода:
var obj = {}; Object.defineProperty(obj, 'val', { writable: false, value: 'foo' });
obj.val = 'bar'; console.log(obj.val); // Выведет 'foo';
Почему так происходит, и как сделать так, чтобы подобные ошибки не замалчивались?


Ответ

Возможность определять свойства, доступные только для чтения появилась относительно недавно, в ES5. Поэтому, в целях обратной совместимости со старым кодом, JavaScript специально замалчивает подобные ошибки.
Если вы хотите, чтобы подобные ошибки не замалчивались, используйте строгий режим
(function() { 'use strict';
var obj = {}; Object.defineProperty(obj, 'val', { writable: false, value: 'foo' });
obj.val = 'bar'; // [TypeError]: "val" is read-only console.log(obj.val); })();
Более подробно, поведение оператора присваивания описано в спецификации ECMAScript. Помимо прочего, в блоке "Note" сказано, что исключение должно выбрасываться только в строгом режиме.
When an assignment occurs within strict mode code <...> the LeftHandSide may not be a reference to a data property with the attribute value {[[Writable]]:false}, to an accessor property with the attribute value {[[Set]]:undefined}, nor to a non-existent property of an object for which the IsExtensible predicate returns the value false. In these cases a TypeError exception is thrown.

Комментариев нет:

Отправить комментарий