JavaScript中能否解除对象属性的freeze(冻结)状态?
关于Object.freeze冻结对象的解冻问题及代码分析
核心结论:一旦通过
Object.freeze()冻结对象,标准JavaScript中没有官方途径可以解除冻结状态,无法在不重新创建对象的前提下恢复其可修改性。Object.freeze()的特性:- 冻结后的对象会被标记为不可扩展,无法添加新属性;
- 对象现有属性会被设为不可配置,无法删除或修改属性的配置规则(比如把可写属性改成不可写);
- 对象的数据属性会被设为不可写,但如果属性值是另一个对象(嵌套对象),这个嵌套对象并不会被冻结——这就是所谓的「浅冻结」。
对你提供的代码片段的分析:
var obj = Object.freeze({foo:'can you add more properties later?', bee: {ahh: '?'}}); Object.defineProperty(obj.bee,'ehh',{value: 'can you change me later?'});
这段代码能成功给obj.bee添加ehh属性,原因就是Object.freeze()只冻结了外层的obj对象,嵌套的obj.bee并没有被冻结,它依然是可扩展、可修改的。如果要让嵌套对象也不可修改,需要手动递归冻结每个嵌套层级,或者实现一个深冻结的工具函数。
内容的提问来源于stack exchange,提问作者user17386646
相关产品推荐
相关产品推荐

