我使用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”对象。
答案 0 :(得分:20)
在尝试分配给不可写属性(ECMA-262: 11.13.1)时,严格模式下的代码将抛出TypeError
。但请注意,您不能依赖于不完全支持ES5严格模式的浏览器(例如IE9)中抛出的错误。
要使代码以严格模式运行,请在包含代码的JS文件或函数的开头添加'use strict';
,并在实现严格模式的环境中运行它(请参阅此列表:{{3 }})。