В 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.
Комментариев нет:
Отправить комментарий