根据MDN Object.freeze()
文档:
该
Object.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
会失败或什么都不做。任何想法如何冻结日期?
有没有办法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
,但是如果没有的话,可以很容易地对其进行调整。
我在Kubernetes集群中有一个服务和RabbitMQ。我想做的是,我希望服务的不同实例(或副本)在启动时声明一个全新的队列。这些队列将绑定到同一个exchange。 我可以在这里放一个最后的变量吗: 本质上,我只需要一种方法,用生成的名称创建一个队列,然后使用@RabbitListener侦听这个队列。
问题内容: 假设我有一个使用lambda表达式(闭包)定义的对象列表。有没有一种方法可以检查它们以便进行比较? 我最感兴趣的代码是 完整的代码是 似乎唯一的解决方案是将每个lambda定义为一个字段,并且仅使用这些字段。如果要打印出称为的方法,最好使用。lambda表达式有更好的方法吗? 此外,是否可以打印lambda并获得人类可读的内容?如果你打印而不是 得到类似的东西 甚至使用和方法。 问题答
我使用的界面看起来大致如下: 并且我目前正在使用一个匿名类来实现接口,但我并不关心这两种方法中的一种。大致如下: 现在,我已经在Java8中尽可能地使用新的lambda表达式,我想在这种情况下使用增加的简单性。毕竟,我只是在实现其中的一个方法,但由于接口中有两个方法,所以我不能在一个lambda表达式中使用它。
问题内容: 使用PMD,如果要忽略特定的警告,则可以使该行被忽略。 FindBugs有类似的东西吗? 问题答案: FindBugs的初始方法涉及XML配置文件(也称为过滤器)。这确实不如PMD解决方案方便,但是FindBugs只能在字节码上工作,而不能在源代码上工作,因此注释显然不是一个选择。例: 但是,为解决此问题,FindBugs稍后引入了另一个基于注释的解决方案(请参阅参考资料),您可以在类
我试着检测一个整音符和一个半音符,但对于半音符,我似乎检测不出来,因为它是一个镂空的圆圈。有没有办法检测出镂空的圆圈? 下面是我的代码:
问题在标题中,这里很新,所以还不太了解这个网站。想使用哈希来创建“更多的随机性”,但还不确定Java的数学。Random()还没有,有可能破解它吗?