Monkey patch JavaScript新日期()
我需要修补JavaScript的日期对象。我唯一需要更改的是Monkey patch JavaScript新日期(),javascript,date,Javascript,Date,我需要修补JavaScript的日期对象。我唯一需要更改的是newdate(),我需要始终返回相同的日期 关于通过偏移量更改日期,也有一个类似的问题,但我想知道我是否用更少的代码做同样的事情 根据上面的问题修改代码,我有一个解决方案: Date = (function(oldDate) { /** * @return {string} */ function Date(year, month, date, hours, minutes, seconds, m
newdate()
,我需要始终返回相同的日期
关于通过偏移量更改日期,也有一个类似的问题,但我想知道我是否用更少的代码做同样的事情
根据上面的问题修改代码,我有一个解决方案:
Date = (function(oldDate) {
/**
* @return {string}
*/
function Date(year, month, date, hours, minutes, seconds, ms) {
let res;
const l = arguments.length;
if (l == 0) {
res = new oldDate(Date.now());
} else if (l == 1) {
res = new oldDate(year); // milliseconds since epoch, actually
} else {
res = new oldDate(
year,
month,
l > 2 ? date : 1,
l > 3 ? hours : 0,
l > 4 ? minutes : 0,
l > 5 ? seconds : 0,
l > 6 ? ms : 0,
);
}
if (this instanceof Date) {
return res;
}
return res.toString();
}
Date.prototype = oldDate.prototype; // required for instanceof checks
Date.now = function() {
return 1570705688585; // HERE I REUTRN A FIXED DATE
};
Date.parse = oldDate.parse;
Date.UTC = oldDate.UTC;
return Date;
})(Date, Date.now);
查看这些文档:
似乎是日期。现在
有一个pollyfill,您可以使用:
if (!Date.now) {
Date.now = function now() {
return new Date().getTime();
};
}
我试过了,但没有效果:
Date.now = function now() {
return 1570705688585;
};
您可能无法仅更改
日期。现在
,因为构造函数可能不会调用该方法。但是,您可以通过直接复制所有属性并仅覆盖日期来缩短修补程序。现在
和零参数构造函数:
//保留以备测试
const OriginalDateConstructor=日期;
日期=(函数(旧日期){
函数日期(…args){
如果(args.length==0){
//重写零参数构造函数
返回新的旧日期(Date.now())
}
//else委托给原始构造函数
返回新的旧日期(…参数);
}
//从原始日期复制所有属性,包括原型
const propertyDescriptors=Object.getOwnPropertyDescriptors(oldDate);
Object.defineProperties(日期、属性描述符);
//覆盖日期。现在
Date.now=函数(){
返回1570705688585;
};
返回日期;
})(日期);
log(“相同的原型”,Object.getPrototypeOf(日期)==Object.getPrototypeOf(OriginalDateConstructor))
log(“无参数”,new Date());
log(“单参数-零”,新日期(0));
log(“单参数-非零”,(新日期(新的OriginalDateConstructor(“2019-01-01”).getTime());
控制台日志(“传递ISO字符串”,新日期(“2019-06-01”);
控制台日志(“过去的年份、月份”,新日期(2019、09));
控制台日志(“过去的年、月、日”,新日期(2019、09、15));
控制台日志(“过去的年、月、日、小时”,新日期(2019、09、15、10));
控制台日志(“过去的年、月、日、小时、分钟”,新日期(2019、07、15、10、30));
控制台日志(“过去的年、月、日、时、分、秒”,新日期(2019、07、15、10、30、45));
控制台日志(“传入日期”,新日期(新日期(“2019-03-01”))
控制台日志(“转换为数字”+新日期(“2019-06-01T12:00”))
log(“隐式转换为字符串”,“新日期”(“2019-06-01T12:00”)
-当我运行代码并调用新日期()时
它给了我2019-10-10T11:08:08.585Z
这就是Unix时间戳的解析结果。@VLAZ当你说“我的代码”时,你是指第一个还是最后一个块?我添加了一个指向JSBin的链接,显示了它的作用。这是我使用的第一段代码。是的,我知道它可以“我有一个解决方案可以解决这个问题”,但是我想知道一个更简短的版本是否也可以。如果可以避免的话,请不要使用猴子补丁