Есть ли способ заставить объект "Object.frozen" выдавать предупреждения при попытке изменить его?
Я использую Object.freeze как средство, чтобы не нарушать свои собственные правила. Я хотел бы, чтобы Object.freeze говорил со мной, когда я пытаюсь выполнить плохое задание. Тем не менее, Object.freeze просто делает назначения молча провалиться! Например, если я сделаю
/*
* Frozen singleton object "foo".
*/
var foo = (function() {
var me = {};
me.bar = 1;
if (Object.freeze) {
Object.freeze(me);
}
return me;
})();
foo.bar = 2;
console.log(foo.bar);
консоль будет записывать "1", но я не буду знать, что когда-либо сделал плохое задание. Это, конечно, может привести к опасному неожиданному поведению в моем коде, когда весь смысл замораживания объекта состоял в том, чтобы избежать неожиданного. Фактически, я с большей вероятностью получу подробные сообщения об ошибках, не замораживая объект, позволяя выполнить неправильное присваивание, и имея мой код позже неудачным из-за неверного значения.
Мне интересно, есть ли в JavaScript какая-либо скрытая прагма "предупреждение о неизменяемом объекте" в любом браузере, чтобы я мог знать, когда я пытаюсь изменить объект "Object.frozen".
2 ответа
Код в строгом режиме выкинет TypeError
при попытке присвоить неписываемое свойство ( ECMA-262: 11.13.1). Но обратите внимание, что нельзя полагаться на ошибку, возникающую в браузерах, которые не полностью поддерживают строгий режим ES5 (например, IE9).
Чтобы ваш код работал в строгом режиме, добавьте 'use strict';
в начале файла JS или функции, содержащей код, и запустите его в среде, которая реализует строгий режим (см., например, этот список: http://caniuse.com/).
Принятый ответ не работает для меня. Я помещаю это в ответ, потому что я не мог четко отформатировать его в комментарии.
Из консоли в Chrome 109:
> f = () => {'use strict'; const x={a:1}; return Object.freeze(x);}
() => {'use strict'; const x={a:1}; return Object.freeze(x);}
> x = f()
{a: 1}
> x.b=4 // (No warning)
4
> x
{a: 1}