栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

有没有办法Object.freeze()一个JavaScript Date?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

有没有办法Object.freeze()一个JavaScript Date?

有没有办法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
,但是如果没有的话,可以很容易地对其进行调整。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/594990.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号