有没有办法Object.freeze()一个Javascript Date?
我不这么认为。但是,您可以 关闭 ,请参阅下面的代码行。但是首先让我们看看为什么
Object.freeze不起作用。
我期望在某个日期调用冻结会阻止对该日期进行更改…
它将 如果
Date使用一个对象的属性,以保持其内部时间价值,但事实并非如此。它使用
[[Datevalue]]
内部插槽 代替。内部插槽不是属性:
内部插槽对应于与对象关联并由各种ECMAscript规范算法使用的内部状态。内部插槽不是对象属性…
因此,冻结对象对其变异
[[Datevalue]]内部插槽的能力没有任何影响。
无论如何,您 都可以 冻结
Date,或有效地冻结它:用no-
op函数(或引发错误的函数)替换其所有mutator方法,然后再替换
freeze。但是,正如zzzzBov
(很好!)_所观察到的那样
,这并不能阻止某人这样做(故意绕过冻结的对象,或作为他们使用的一些复杂代码的副产品)。所以 _很近 ,但是没有雪茄。
Date.prototype.setTime.call(d, 0)
这是一个示例(我在这里使用ES2015功能,因为我
let在您的代码中看到了它,因此您需要使用最新的浏览器来运行它;但这也可以通过仅ES5的功能来完成):
"use strict";let d = new Date();freezeDate(d);d.setTime(0);snippet.log(d);function nop() {}function freezeDate(d) { allNames(d).forEach(name => { if (name.startsWith("set") && typeof d[name] === "function") { d[name] = nop; } }); Object.freeze(d); return d;}function allNames(obj) { var names = Object.create(null); // Or use Map here var thisObj; for (thisObj = obj; thisObj; thisObj = Object.getPrototypeOf(thisObj)) { Object.getOwnPropertyNames(thisObj).forEach(name => { names[name] = 1; }); } return Object.keys(names);}<!-- script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --><script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>我 认为 以
Date开头的所有mutator方法都可以
set,但是如果没有的话,可以很容易地对其进行调整。



