跳到主要内容

JavaScript对象限制操作:冻结、密封与不可扩展

阅读需 2 分钟

JavaScript对象限制操作:冻结(Object.freeze)、密封(Object.freeze)与不可扩展(Object.preventExtensions)

在JavaScript中,我们可以通过三种方法限制对象的修改行为,分别是Object.freeze()Object.seal()Object.preventExtensions()。这些方法在不同程度上限制了对象的可变性,对于创建不可变数据或保护对象结构非常有用。

1. 不可扩展对象 (Object.preventExtensions)

禁止对象添加新属性,但允许修改和删除现有属性。

const obj = { name: "John" };
Object.preventExtensions(obj);

obj.age = 30; // 静默失败或TypeError(严格模式)
obj.name = "Mike"; // 允许修改
delete obj.name; // 允许删除

检查是否可扩展:

Object.isExtensible(obj); // false

2. 密封对象 (Object.seal)

禁止添加/删除属性,但允许修改现有属性的值。

const sealedObj = { role: "admin" };
Object.seal(sealedObj);

sealedObj.role = "user"; // 允许修改
sealedObj.age = 25; // 失败
delete sealedObj.role; // 失败
检查是否被密封:

javascript
Object.isSealed(sealedObj); // true

3. 冻结对象 (Object.freeze)

最高限制级别:

禁止添加/删除属性 禁止修改现有属性值 禁止修改属性描述符

const frozenObj = { id: 123 };
Object.freeze(frozenObj);

frozenObj.id = 456; // 静默失败
frozenObj.name = "test"; // 失败
delete frozenObj.id; // 失败

检查是否被冻结:

Object.isFrozen(frozenObj); // true

对比总结

限制方法添加属性删除属性修改值修改属性描述符检查方法
Object.preventExtensionsObject.isExtensible()
Object.sealObject.isSealed()
Object.freezeObject.isFrozen()

注意事项

浅冻结:这些操作都是浅层的,嵌套对象不受影响 严格模式:在严格模式下违规操作会抛出TypeError 不可逆:一旦应用这些限制,无法撤销

实际应用场景

配置对象保护 防止意外修改核心数据 提高性能(V8引擎会优化冻结对象) 作为不可变数据的简单实现

Loading Comments...