
Object.seal() 会将对象变为“密封”状态:不能添加新属性、不能删除已有属性,同时将所有现有属性的 configurable 描述符设为 false,但 writable 不受影响(除非原本就是 false)。
密封后无法修改属性的可配置性
密封前,若某属性 configurable: true,可通过 Object.defineProperty 修改其 enumerable、writable 或删除它;密封后,任何尝试将 configurable 设为 true 的操作都会静默失败(非严格模式)或抛出 TypeError(严格模式)。
即使 writable 是 true,也无法再把该属性变成 accessor(因为定义 getter/setter 需要 configurable: true) 无法用 delete 删除属性,也不能用 defineProperty 改变其 configurable 状态
writable 属性保持原样,但受限于 configurable
Object.seal() 不会主动改动 writable。如果一个数据属性原本 writable: true,密封后仍可赋值;若原本 writable: false,则依然不可写。
但要注意:一旦 configurable 变为 false,就再也不能把 writable 从 false 改成 true 也不能把数据属性转成访问器属性(需要先设 configurable: true,再 defineProperty 添加 get/set)
enumerable 描述符不受 seal 直接影响,但间接受限
seal 不修改 enumerable,所以你可以仍用 defineProperty 把 enumerable 从 true 改为 false(只要 writable 和 configurable 允许)。但反过来,若 enumerable 原本是 false,且 configurable 是 false(seal 后必为 false),就无法再把它改回 true。
立即学习“Java免费学习笔记(深入)”;
也就是说:seal 后,enumerable 只能“关”,不能“开”(除非原先是 true 且你主动关掉) for…in、Object.keys() 等枚举行为只取决于当前 enumerable 值,与 seal 无关
对比 Object.freeze 和 Object.preventExtensions
三者递进增强保护:
preventExtensions:仅禁止新增属性,configurable/writable/enumerable 全部不变 seal:preventExtensions + 所有现有属性 configurable: false freeze:seal + 所有数据属性 writable: false(访问器属性不受 writable 影响)

评论(0)