我做了一些搜索,发现 JavaScript 对象可以是 frozen 或 sealed,这意味着它们分别不能被修改或添加新属性。
我理解这些方法的作用,但不明白为什么有人想要在代码库中使用它们。
我对为什么使用freeze()
的一个猜测是为了防止意外修改变量类别中的错误:默认情况下使用
const
声明变量可以防止很多此类错误(尽管
const
仅适用于绑定,并且不是变量本身)并且几乎没有语法负担。另一方面,在每个声明的对象上调用
.freeze()
似乎非常不切实际,而且我还没有见过代码库这样做。但是,我什至不知道何时使用
seal()
。
constants
。假设您有一个屋顶应用程序,并且有四种屋顶类型:
const roofPrices = Object.freeze({ metal: 200, slate: 350, clay: 150, solar: 400});
编辑:如果有人想知道为什么
const
声明不处理这个问题,
const
(与
let
相反)仅将变量分配给内存中的一个位置。这意味着您无法更改标量
const
变量,但由于可以更改对象而不改变其在内存中的位置,因此您必须使用其他方法使它们真正保持不变。
const
)变量和(冻结)对象之间的区别在于前者是本地的,而后者通常在整个应用程序中传递。如果人们不同意对象是否应该可变的期望,那么意外修改就会容易得多。通常,修改是可以的,但是,OOP 的整个范式依赖于对象更改状态和相互通信(通过消息,无论是方法调用还是 setter 调用)。修改“您的”对象是常态,并且允许代码的其他部分根据需要自定义它们。这就是为什么您没有看到每个对象都被冻结的代码库。 但是,当您的代码依赖于对象的不可变性并且不信任其他代码来保持该不变性时,您会冻结对象。如果发生不好的事情,您宁愿在尝试修改对象时得到异常并立即发现该错误,也不愿在没有明确来源的情况下使用错误的值导致严重破坏。
是的,这比您想象的更常见,面向函数编程的库经常(深度)冻结对象,至少在开发模式下是如此,以便尽快发现有缺陷的代码。
另一方面,Object.seal() 方法用于防止向对象添加新属性,但允许修改现有属性。这意味着该对象仍然是可变的,但不能扩展。 Object.seal() 对于创建具有一组固定属性的对象非常有用,但这些属性的值可能需要更改。
一般来说,Object.freeze() 和 Object.seal() 都用于创建具有一组固定且已知属性的对象,这有助于防止意外更改并提高程序的可靠性和可预测性。这些方法对于创建应在程序中用作常量的对象也很有用,例如配置对象或查找表。
Object.freeze()
对于单元测试和模拟对象非常有用。您可以释放对象以确保它保持不变并防止在整个测试过程中产生副作用。例如
export const fakeUser: User = Object.freeze({
id: '00000000',
// ...other fields
});
export const createFakeUser = () => {
return {
...fakeUser,
};
};
这样您就拥有了一个一致的基础对象,您可以为不同的测试创建该对象,而不会影响原始的fakeUser
对象。