【发布时间】:2016-04-26 17:28:14
【问题描述】:
根据MDN Object.freeze() documentation:
Object.freeze()方法冻结一个对象:即阻止向其添加新属性;防止现有属性被删除;并防止更改现有属性或其可枚举性、可配置性或可写性。本质上,对象实际上是不可变的。该方法返回被冻结的对象。
我原以为在某个日期调用 freeze 会阻止对该日期的更改,但它似乎不起作用。这是我正在做的事情(运行 Node.js v5.3.0):
let d = new Date()
Object.freeze(d)
d.setTime(0)
console.log(d) // Wed Dec 31 1969 16:00:00 GMT-0800 (PST)
我原以为对setTime 的调用要么失败,要么什么都不做。任何想法如何冻结日期?
【问题讨论】:
-
我们正在从文件加载 JSON 编码的配置,并希望确保应用程序的其他部分不会意外更改此配置。因此,我们在整个对象上递归调用
Object.freeze()。除了这个棘手的日期问题之外,它似乎有效。 -
将日期存储为字符串或时间戳,并在使用前将其转换为日期对象,或者您可以为该字符串对象创建一个将返回日期的getter。这样你根本不会使用日期对象,所以这不需要冻结日期
-
考虑所有不可变的函数,因为它们返回一个新对象。不确定这将如何与 freeze() 交互。
-
这是我享受默认不变性的原因。
-
@BenC.R.Leggiero 同意。可变日期是 Java 和 JavaScript 的基本缺陷。它会导致无穷无尽的问题。
标签: javascript node.js immutability