Object.seal仅封印对象自身结构,禁止增删属性和修改属性描述符,但允许修改可写属性的值;需递归密封嵌套对象并配合const声明、安全导出才能防护HTML编辑器配置。

Object.seal 用于封印一个对象,使其不能添加新属性、删除已有属性,但允许修改已有属性的值(前提是该属性是可写的)。
封印后能做什么、不能做什么
封印对象后:
- ✅ 仍可读取和修改已有属性的值(如果该属性 writable 为 true)
- ✅ 仍可遍历属性、访问原型链
- ❌ 不可添加新属性
- ❌ 不可删除已有属性
- ❌ 不可重新配置属性(比如把 writable 设为 false,或把 configurable 设为 true)
基本用法示例
直接传入目标对象即可:
```jsconst obj = { name: "Alice", age: 30 };
Object.seal(obj);
obj.name = "Bob"; // ✅ 允许修改值
delete obj.age; // ❌ 失败,返回 false(严格模式下报 TypeError)
obj.city = "Beijing"; // ❌ 无效,obj.city 仍是 undefined
Object.defineProperty(obj, "name", { writable: false }); // ❌ 报 TypeError
```
如何判断对象是否被封印
使用 Object.isSealed 检测:
立即学习“Java免费学习笔记(深入)”;
```jsconsole.log(Object.isSealed(obj)); // true
console.log(Object.isSealed({})); // false
```
注意:它只检测“是否封印”,不反映是否冻结(frozen)或是否不可扩展(extensible)。封印对象一定是不可扩展的,但不可扩展的对象未必被封印。
和 Object.freeze、Object.preventExtensions 的区别
三者限制程度递增:
- preventExtensions:只禁止新增属性,其余都允许
- seal:在 preventExtensions 基础上,还禁止删属性、禁止 reconfigure(configurable: false)
-
freeze:在 seal 基础上,还把所有属性设为
writable: false,彻底禁止修改值
它们都返回原对象,不创建副本;且对对象自身生效,不影响嵌套对象(需手动递归处理)。


















