Monkey patch JavaScript新日期()

Monkey patch JavaScript新日期(),javascript,date,Javascript,Date,我需要修补JavaScript的日期对象。我唯一需要更改的是newdate(),我需要始终返回相同的日期 关于通过偏移量更改日期,也有一个类似的问题,但我想知道我是否用更少的代码做同样的事情 根据上面的问题修改代码,我有一个解决方案: Date = (function(oldDate) { /** * @return {string} */ function Date(year, month, date, hours, minutes, seconds, m

我需要修补JavaScript的日期对象。我唯一需要更改的是
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的链接,显示了它的作用。这是我使用的第一段代码。是的,我知道它可以“我有一个解决方案可以解决这个问题”,但是我想知道一个更简短的版本是否也可以。如果可以避免的话,请不要使用猴子补丁