Object.seal禁止增删属性但可修改值,Object.freeze则完全锁定对象;两者均为浅冻结,嵌套对象需递归处理。

Object.freeze 和 Object.seal 都用于限制对象的修改,但它们的作用程度不同。理解两者的区别有助于在需要控制对象可变性时做出合适选择。
Object.seal:禁止添加或删除属性
调用 Object.seal(obj) 后,对象的属性无法被添加或删除,但已有属性的值仍可修改。属性的描述符(如 writable、configurable)也会受到限制。
不能添加新属性 不能删除已有属性 可以修改已有属性的值(前提是 writable: true) 不能将属性从 configurable 变为不可配置(configurable 会被设为 false)例如:
const obj = { name: "Alice" };Object.seal(obj);obj.name = "Bob"; // ✅ 允许obj.age = 25; // ❌ 无效(非严格模式下静默失败)delete obj.name; // ❌ 无效
Object.freeze:完全冻结对象
Object.freeze(obj) 比 seal 更严格。它不仅禁止增删属性,还禁止修改任何已有属性的值。
不能添加新属性 不能删除已有属性 不能修改已有属性的值(即使 writable: true,也无法更改) 所有属性变为不可写(writable: false)例如:
const obj = { name: "Alice" };Object.freeze(obj);obj.name = "Bob"; // ❌ 无效(严格模式报错)obj.age = 25; // ❌ 无效delete obj.name; // ❌ 无效
两者都不处理深层对象
需要注意的是,seal 和 freeze 都是浅操作。如果对象的属性是引用类型(如对象或数组),其嵌套内容仍可能被修改。
立即学习“Java免费学习笔记(深入)”;
const obj = { user: { name: "Alice" } };Object.freeze(obj);obj.user.name = "Bob"; // ✅ 成功!内部对象未被冻结
若要彻底冻结,需递归调用 freeze 或使用深冻结工具函数。
基本上就这些。seal 保留属性可写性,freeze 则全面锁定。根据需求选择即可。
以上就是JavaScript 的 Object.freeze 与 Object.seal 在限制对象修改时有何不同?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1522971.html
微信扫一扫
支付宝扫一扫