[英]Object.freeze doesnt prevent object from being reinitialized?
為應用程序編寫一些腳本-我不是要確保客戶端代碼的安全 ,而是要提供足夠的安全性,以使任何有控制台的人都無法走開並毫不費力地覆蓋它。
考慮以下示例:
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 = {}
< Object
> config.gridSize = 32
< 32
> config.gridSize
< 32
我以為Object.freeze
應該防止這種情況發生? 我是在做錯什么,還是只是誤解了它的目的?
您誤解了它的目的。 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
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.