Object.freeze 比 Object.seal 保护更强:两者均禁止增删属性且不可修改描述符,但 freeze 还禁止修改属性值;均不递归处理嵌套对象;isFrozen 为真必 isSealed 为真,反之不成立。

Object.freeze 和 Object.seal 都能限制对象的修改,但保护强度不同:freeze 更严格,seal 更宽松。
能否添加或删除属性?
两者都禁止新增和删除属性:
-
Object.seal(obj):把对象设为“密封”,内部将
configurable设为false,因此无法delete属性,也无法用Object.defineProperty改配置(比如变回可删);但已有属性的值仍可改(如果它是 writable)。 -
Object.freeze(obj):在 seal 基础上,进一步把所有自有属性的
writable设为false,所以不仅不能增删属性,连基本类型的属性值也不能改。
能否修改属性描述符?
都不能:
- seal 后,对任意自有属性调用
Object.defineProperty会抛错(因为 configurable 是 false)。 - freeze 同样会报错,且即使某个属性原本 writable: true,freeze 后也不允许再设为 writable: true(因为 descriptor 修改本身就被禁了)。
是否影响嵌套对象?
都不递归处理:
立即学习“Java免费学习笔记(深入)”;
- 如果对象里有子对象,seal 或 freeze 只作用于顶层,子对象依然可自由修改。
- 需要深层冻结时,得手动递归调用
Object.freeze,或借助工具函数(注意循环引用问题)。
如何检查对象是否被冻结或密封?
可用内置方法判断:
-
Object.isSealed(obj)返回布尔值,表示是否密封(即 configurable 全为 false,且 extensible 为 false)。 -
Object.isFrozen(obj)要求更严:extensible 为 false + 所有自有属性的 configurable 和 writable 都为 false。 - 注意:
isFrozen为 true 必然意味着isSealed也为 true,但反过来不成立。










