Object freeze vs seal


title: JavaScript中Object.freeze()和Object.seal()的区别是什么? shortTitle: Object.freeze() vs Object.seal() type: question language: javascript tags: [object] cover: frozen-globe excerpt: Object.freeze()Object.seal()都用于防止JavaScript对象被修改,尽管它们相似,但有一个关键的区别需要记住。 dateModified: 2022-02-06


Object.freeze()Object.seal()都用作防止JavaScript对象被修改的方法。尽管相似,但它们有一个需要记住的关键区别。

const frozen = Object.freeze({ username: 'johnsmith' });
const sealed = Object.seal({ username: 'johnsmith' });

frozen.name = 'John Smith';  // frozen = { username: 'johnsmith' }
sealed.name = 'John Smith';  // sealed = { username: 'johnsmith' }

delete frozen.username;      // frozen = { username: 'johnsmith' }
delete sealed.username;      // sealed = { username: 'johnsmith' }

frozen.username = 'jsmith';  // frozen = { username: 'johnsmith' }
sealed.username = 'jsmith';  // sealed = { username: 'jsmith' }

如果你想防止添加新属性和删除现有属性,那么这两种方法都可以满足你的需求。然而,如果你想防止修改现有属性,那么你必须使用Object.freeze()。原因是Object.seal()只将现有属性标记为不可配置,这意味着只要它们是可写的,它们的值可以被改变。

创建 读取 更新 删除
Object.freeze()
Object.seal()

最后要注意的是,这两种方法都对对象执行浅冻结/封闭。这意味着嵌套的对象和数组不会被冻结或封闭,可以被修改。要防止这种情况发生,你可以对对象进行深度冻结,如这篇相关文章中所述。