Javascript Object.freeze不阻止对象重新初始化?
为一个应用程序编写一些脚本——我并不是想让客户端代码安全,但我试图提供足够的安全性,让任何一个拥有控制台的人都无法通过并轻松地覆盖它 考虑这个例子:Javascript Object.freeze不阻止对象重新初始化?,javascript,security,object,Javascript,Security,Object,为一个应用程序编写一些脚本——我并不是想让客户端代码安全,但我试图提供足够的安全性,让任何一个拥有控制台的人都无法通过并轻松地覆盖它 考虑这个例子: var config = {}; Object.defineProperty(config, "gridSize", { value : 64, writable : false }); Object.freeze(config); 我希望这会创建一个对象config,,其属性gridSize设置为64,不能被覆盖,然后防止使用object.fr
var config = {};
Object.defineProperty(config, "gridSize", { value : 64, writable : false });
Object.freeze(config);
我希望这会创建一个对象config,
,其属性gridSize
设置为64
,不能被覆盖,然后防止使用object.freeze
修改配置
果不其然,当我尝试在控制台中插入此脚本时,它的作用非常明显:
> config.gridSize
< 64
> config.gridSize = 32
< 32
> config.gridSize
< 64
>config.gridSize
< 64
>config.gridSize=32
< 32
>config.gridSize
< 64
但当我尝试直接重置对象时:
> config = {}
< Object
> config.gridSize = 32
< 32
> config.gridSize
< 32
>config={}
我以为
Object.freeze
应该阻止这一切?我是做错了什么,还是只是误解了它的目的?你误解了它的目的<代码>对象。冻结可防止对象完全被修改,并使其正常工作。你在那里做的是制造另一个物体。原始对象没有改变(直到它被销毁),但它已经移动了。变量只是容器,它们总是不同的
您可以使用常量
,这不是普遍支持的。(它是ECMAScript 6的正式组成部分,但不是ECMAScript 5。)
顺便说一下,如果你的房子看起来像这样,一个简单的
const config = Object.freeze({
gridSize: 64
});
工作
对于“可移植”解决方案,您可以在全局对象上定义它(但这并不完美):
我没有在FF linux中看到“错误”行为。在
config.gridSize=32之后代码>,config.gridSize
仍然是64。可能只是chrome而已-谢谢你尝试重现一个出色的答案,const
正是我想要的!我略去了IE10-,这有点伤人,但谢天谢地,这并不是项目规范的一部分。
Object.defineProperty(window, "config", {
value: Object.freeze({ gridSize: 64 }),
writable: false,
configurable: false
});