Есть ли способ заставить объект "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}
Другие вопросы по тегам