我做了一些搜索,发现JavaScript对象可以是frozen或sealed,这分别意味着它们不能被修改或添加新属性。
我理解这些方法的作用,但不理解为什么要在代码库中使用它们。
对于为什么使用freeze()
,我有一个猜测,那就是防止意外修改变量这一类的错误:默认情况下,用const
声明变量可以避免很多这样的错误(尽管const
只适用于绑定,而不是变量本身),并且几乎不会增加语法负担。另一方面,在每个声明的对象上调用.freeze()
似乎非常不切实际,我还没有见过代码库这样做。
然而,我甚至没有一个可行的猜测何时使用seal()
。
3条答案
按热度按时间jckbn6z71#
两者的区别(
const
)变量和(frozen)对象的特点是前者是局部的,而后者通常在整个应用程序中传递。如果人们对一个对象是否应该是可变的期望不一致,意外的修改就容易得多。通常,修改是可以的,然而,OOP的整个范例依赖于对象改变状态和相互通信(通过消息,无论是方法调用还是setter调用)。修改“您的”对象是一种规范,并允许代码的其他部分根据需要定制它们。这就是为什么你没有看到 every 对象被冻结的代码库。然而,当你的代码依赖于对象的不可变性,而不信任其他代码保持不变时,你会冻结对象。如果有不好的事情发生,你宁愿在试图修改对象时得到一个异常,并立即找到那个bug,而不是有一个错误的值,在没有明确出处的情况下造成破坏。
是的,这比你想象的要普遍,面向函数式编程的库经常(深度)冻结对象,至少在开发模式下是这样,以便尽快发现有错误的代码。
wnvonmuf2#
一个用途是创建
constants
。假设您有一个屋顶应用程序,并且有四种屋顶类型:const roofPrices = Object.freeze({ metal: 200, slate: 350, clay: 150, solar: 400});
通过冻结对象,可以确保不会意外更改价格,或者通过密封对象,确保不会意外添加或删除新的“类型”。
编辑:如果有人想知道为什么
const
声明没有注意到这一点,const
(与let
相对)只将变量赋值给内存中的一个位置。这意味着你不能改变标量const
变量,但由于对象可以在不改变它们在内存中的位置的情况下被改变,你必须使用其他方法使它们真正恒定。3okqufwl3#
在JavaScript中,Object.freeze()方法用于防止修改现有属性和向对象添加新属性。这意味着对象变为只读,并且不能以任何方式进行更改。Object.freeze()对于创建应保持不变并且不能被程序的任何部分修改的对象非常有用。
另一方面,Object.seal()方法用于防止向对象添加新属性,但允许修改现有属性。这意味着对象仍然是可变的,但不能扩展。Object.seal()方法用于创建具有固定属性集的对象,但这些属性的值可能需要更改。
一般来说,Object.freeze()和Object.seal()都是用来建立具有固定且已知属性集的对象,这有助于防止意外的变更,并改善程式的可靠性和可预测性。这些方法也可以用来建立应该在程式中当做常数使用的对象,例如组态对象或查阅表格。