Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Object.freeze不阻止对象重新初始化?_Javascript_Security_Object - Fatal编程技术网

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={}
config.gridSize=32
< 32
>config.gridSize
< 32


我以为
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
});