Object.freeze冻结属性?或者如何将属性设置为不可变/只读?

bra*_*ipt 9 javascript immutability

Object.freeze()状态的文档,它只允许冻结对象,如果它的原始类型实际上是"对象".我正在使用一些JSON数据对象,并希望使用它来将特定属性设置为不可变(例如,uuid,它在db中是不可变的).Object.freeze()似乎是完美的解决方案,直到:

TypeError: Object.freeze called on non-object

该死.

所以,假设我有一个对象(从JSON解析),如下所示:

{
    "uuid": "765926c1-911e-49b2-b597-48cf0df59a17",
    "firstName": "Bob",
    "lastName": "Dole"
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以迫使uuid变成一成不变的吗?

Mat*_*zer 21

是的,您需要使用Object.defineProperty并重新定义uuid属性描述符,使其不可写且不可配置:

Object.defineProperty(obj, "uuid", { configurable: false, writable: false });
Run Code Online (Sandbox Code Playgroud)

configurable: false意味着从现在起uuid无法再次定义属性描述符.也就是说,没有其他句子可以让财产再次变异.

在一天结束时,Object.freeze就像一个快捷方式,它迭代给定对象中的所有可枚举属性,并将它们转换为不可配置的+不可写的属性.