簡體   English   中英

Object.freeze不會阻止對象重新初始化嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM