javascript - JavaScript 中 Object.freeze() 和 Object.seal() 的用例是什么?

标签 javascript immutability

我做了一些搜索,发现 JavaScript 对象可以是 frozensealed ,这意味着它们不能分别被修改或添加新属性。

我理解这些方法的作用,但不理解为什么人们会想在代码库中使用它们。

我对为什么要使用freeze()的一个猜测是为了防止意外修改变量类别中的错误:默认情况下用const声明变量可以防止很多此类错误(尽管 const 仅适用于绑定(bind),而不适用于变量本身)并且几乎没有语法负担。另一方面,对每个声明的对象调用 .freeze() 似乎是非常不切实际的,而且我从未见过代码库这样做。

但是,对于何时使用 seal(),我什至没有一个可行的猜测。

最佳答案

(const) 变量和(卡住的)对象之间的区别在于前者是本地的,而后者通常在整个应用程序中传递。如果人们不同意对象是否应该可变的期望,则意外修改会容易得多。通常情况下,修改是可以的,但是,OOP 的整个范例依赖于对象改变状态和相互通信(通过消息,无论是方法调用还是 setter 调用)。修改“你的”对象是常态,并允许代码的其他部分根据需要自定义它们。这就是为什么您没有看到每个对象都被卡住的代码库。

然而,当您的代码依赖于对象不可变并且不信任其他代码来保持这种不变性时,您会卡住对象。如果坏事发生,您宁愿在尝试修改对象时得到一个异常并立即找到该错误,而不是在没有明确来源的情况下使用错误的值导致严重破坏。

是的,这比您想象的更常见,面向函数式编程的库经常(深度)卡住对象,至少在开发模式下如此,以便尽快发现错误代码。

关于javascript - JavaScript 中 Object.freeze() 和 Object.seal() 的用例是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74737846/

相关文章:

javascript - 加载时堆叠图像 - Slick

scala - 如何递增传递给 Scala 函数的整数变量?

javascript - 我如何在 mouseleave 上淡出这个淡入淡出?

javascript - 解析 JavaScript 中的输入

javascript - 指出当前 JS 中使用的 DOM 类?

用于多线程系统的 Java 不可变对象(immutable对象)。我做错了什么?

python - 在Python for循环中改变 float 的值

c# - 为什么使用只读IEnumerable <T>

java - 非最终类可以完全不可变吗?

javascript - _.extend(Something.prototype, someObj) 和 Something.prototype.someFunc = someFunc 有什么区别?