javascript中object-seal密封对象对描述符的影响

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 影响)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。