为应用程序编写一些脚本 - 我不是想让我的客户端代码安全,但我试图提供足够的安全性,任何拥有控制台的人都无法行走通过并毫不费力地覆盖它。
考虑这个例子:
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
本来应该阻止这个?我做错了什么,或只是误解了它的目的?
答案 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
});