我使用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”对象。
2条答案
按热度按时间u3r8eeie1#
严格模式下的代码在尝试为不可写属性赋值时将抛出
TypeError
(ECMA-262:11.13.1)。但是请注意,在不完全支持ES 5严格模式的浏览器(如IE9)中,您不能依赖抛出的错误。要使代码在严格模式下运行,请在包含代码的JS文件或函数的开头添加
'use strict';
,并在实现严格模式的环境中运行它(例如,请参见以下列表:http://caniuse.com/#feat=use-strict).w1jd8yoj2#
已接受的答案对我无效。我将此内容放在答案中,因为我无法在注解中清楚地设置其格式。
从Chrome 109中的控制台: