Страницы

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

понедельник, 24 февраля 2020 г.

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

#javascript


В JavaScript можно определить свойство, доступное только для чтения (readonly). Однако,
если я пытаюсь переопределить значение такого свойства, то ничего не происходит. Значение
остается прежним, но и исключение не выбрасывается.

Пример кода:

var obj = {};
Object.defineProperty(obj, 'val', {
    writable: false,
    value: 'foo'
});

obj.val = 'bar';
console.log(obj.val); // Выведет 'foo';


Почему так происходит, и как сделать так, чтобы подобные ошибки не замалчивались?
    


Ответы

Ответ 1



Возможность определять свойства, доступные только для чтения появилась относительно недавно, в 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.

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

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