javascript 有没有办法让“Object.frozen”对象在试图更改它时抛出警告?

rdlzhqv9  于 2023-02-15  发布在  Java
关注(0)|答案(2)|浏览(125)

我使用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”,但我不知道我曾经做了一个错误的赋值。2这当然会导致我的代码中危险的意外行为,而冻结对象的全部目的是为了避免意外。3事实上,我更有可能得到冗长的错误输出,不冻结对象,让错误的赋值发生,并让我的代码稍后因为错误的值而失败。
我想知道JavaScript在任何浏览器中是否有任何隐藏的“不可变对象警告”杂注,这样我就可以知道我何时试图改变“Object.frozen”对象。

u3r8eeie

u3r8eeie1#

严格模式下的代码在尝试为不可写属性赋值时将抛出TypeError(ECMA-262:11.13.1)。但是请注意,在不完全支持ES 5严格模式的浏览器(如IE9)中,您不能依赖抛出的错误。
要使代码在严格模式下运行,请在包含代码的JS文件或函数的开头添加'use strict';,并在实现严格模式的环境中运行它(例如,请参见以下列表:http://caniuse.com/#feat=use-strict).

w1jd8yoj

w1jd8yoj2#

已接受的答案对我无效。我将此内容放在答案中,因为我无法在注解中清楚地设置其格式。
从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}

相关问题