Object.freeze不会阻止对象重新初始化?

时间:2013-11-22 17:17:04

标签: javascript security object

为应用程序编写一些脚本 - 我不是想让我的客户端代码安全,但我试图提供足够的安全性,任何拥有控制台的人都无法行走通过并毫不费力地覆盖它。

考虑这个例子:

var config = {};
Object.defineProperty(config, "gridSize", { value : 64, writable : false });
Object.freeze(config);

我希望这会创建一个对象config,,其属性gridSize设置为64无法覆盖 - 然后阻止使用{{1修改配置}}

果然,当我尝试在控制台中穿透这个脚本时,它很快就会坚持下去:

Object.freeze

但是当我尝试直接重置对象时:

> config.gridSize
< 64
> config.gridSize = 32
< 32
> config.gridSize
< 64

我认为> config = {} < Object > config.gridSize = 32 < 32 > config.gridSize < 32 本来应该阻止这个?我做错了什么,或只是误解了它的目的?

1 个答案:

答案 0 :(得分:2)

你误解了它的目的。 Object.freeze可以防止对象完全被修改,并且它正在完成它的工作。你在那里做的是做另一个对象。原始对象没有改变(好吧,直到它被破坏),但它已经移动了。变量只是容器,它们总是不同的。

您可以使用不受普遍支持的const。 (它正式是ECMAScript 6的一部分,但不是ECMAScript 5.)

顺便说一下,如果你的财产看起来像那样,那就简单了

const config = Object.freeze({
    gridSize: 64
});

作品。

对于“便携式”解决方案,您可以在全局对象上定义它(但这并不漂亮):

Object.defineProperty(window, "config", {
    value: Object.freeze({ gridSize: 64 }),
    writable: false,
    configurable: false
});