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