Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重写Javascript日期构造函数?_Javascript_Date - Fatal编程技术网

重写Javascript日期构造函数?

重写Javascript日期构造函数?,javascript,date,Javascript,Date,我正在开发一个对当前日期敏感的浏览器应用程序 在我的应用程序代码中,我调用newdate,根据当前时间执行计算,并相应地呈现视图 为了在不同的日历日测试我的应用程序,我必须不断地将我的系统时钟更改为过去或未来,这是一种烦恼,可能对我的计算机不健康 因此,纯粹出于测试目的(我不会在生产中使用此代码),我决定通过在控制台中执行以下操作来覆盖内置的Date构造函数: // create a date object for this Friday: var d = new Date(2012, 0, 2

我正在开发一个对当前日期敏感的浏览器应用程序

在我的应用程序代码中,我调用
newdate
,根据当前时间执行计算,并相应地呈现视图

为了在不同的日历日测试我的应用程序,我必须不断地将我的系统时钟更改为过去或未来,这是一种烦恼,可能对我的计算机不健康

因此,纯粹出于测试目的(我不会在生产中使用此代码),我决定通过在控制台中执行以下操作来覆盖内置的
Date
构造函数:

// create a date object for this Friday:
var d = new Date(2012, 0, 20)
//override Date constructor so all newly constructed dates return this Friday
Date = function(){return d}
考虑到这个假设,我尝试了这个方法,得到了奇怪的结果:

var now = new Date
Sat Apr 07 2012 00:00:00 GMT-0400 (EDT)

now = new Date
Tue Jul 10 2012 00:00:00 GMT-0400 (EDT)

now = new Date
Wed Jul 09 2014 00:00:00 GMT-0400 (EDT)

now = new Date
Wed Jun 07 2023 00:00:00 GMT-0400 (EDT)
……等等

我的问题是,这里到底发生了什么

如果我重写构造函数以返回静态日期,为什么它会给出不相关且不断递增的日期

另外,是否有一种有效的方法可以重写日期构造函数,以便在将来返回静态日期,而无需在代码中执行所有日期实例化调用并修改输出

提前谢谢

编辑:

我在一个新窗口中尝试了我的代码,它按预期工作

罪魁祸首似乎是调用其“刷新”方法的jQueryUIDatePicker插件。当我禁用它的调用时,日期覆盖正常工作,但只要我使用datepicker,就会出现上述奇怪的行为

不知道为什么这个流行的插件会以某种方式影响像这样的全球事物。如果有人有任何想法,请告诉我

对不起,没有早点找出真正的罪犯。

试试看

var d = new Date(2012, 0, 20);
// undefine date so that it will only return what your function returns
Date = undefined;   
Date = function(){return d;}
修改原型以指向对象应该可以做到这一点

我相信您之前经历的奇怪行为是,Date持有一些时间概念,并且由于原型指向内部时钟,因此您得到的是随机时间。

我测试了您的代码:

// create a date object for this Friday:
var d = new Date(2012, 0, 20);
//override Date constructor so all newly constructed dates return this Friday
Date = function(){return d;};

var now = new Date()
console.log(now);

now = new Date()
console.log(now);

now = new Date()
console.log(now);

now = new Date()
console.log(now);
结果呢????为什么如此不同

Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)}
Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)}
Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)}
Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)}

编辑:

我看到无论何时你与日期选取者互动,行为都会有所不同。尝试另一个测试,现在更改
类似于与日期选择器交互:

// create a date object for this Friday:
var d = new Date(2012, 0, 20);
//override Date constructor so all newly constructed dates return this Friday
Date = function(){return d;};

var now = new Date();
var another = new Date();
console.log(now);

another.setDate(13);

now = new Date()
console.log(now);
结果是:

Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)}
Date {Fri Jan 13 2012 00:00:00 GMT+0700 (SE Asia Standard Time)}
那么,出了什么问题? 您已通过重写核心日期函数

Date = function(){return d;}; // after construction, all date will be d (2012-01-20)
var now = new Date(); // you instantiate a date, but actually now variable is d (2012-01-20)
var another = new Date(); // you instantiate a date, but another is still d (2012-01-20)
another.setDate(13); // change another date to 13 is to change now to 13 (because now and another is still one d)

now = new Date() // still d
console.log(now); // print out now (2012-01-13)

因此,您通过一个函数覆盖核心日期函数,该函数使所有日期使用相同(仅一个)实例,即d(2012-01-20)。更改任何日期都会影响其他人。

我也遇到了这个问题,并为此编写了一个模块。也许它对某些人有用:

Github:


这对我有用

即如何返回1分钟后的处理时间

Date = class extends Date{
     constructor(options) {
       if (options) {
         super(options);
       } else {
         super(Date.now() - 1000 * 60);
       }
     }
   };
的答案几乎可以满足我的要求,但这种修改使构造函数在给定参数时像以前一样工作

    Date = class extends Date {
      constructor(...options) {
        if (options.length) {
          super(...options);
        } else {
          super(2019, 2, 11, 19, 19);
        }
      }
    };

我使用以下命令强制UTC日期

var _f = function(item) { 
   Date.prototype["get" + item] = Date.prototype["getUTC" + item];  
   Date.prototype["set" + item] = Date.prototype["setUTC" + item];  
}
var _d = ['Milliseconds', 'Seconds', 'Minutes', 'Hours', 'Date', 'Month', 'FullYear', 'Year', 'Day'];
_d.forEach(_f);

Date = class extends Date {
   constructor(...options) {
      if (options.length == 1 && options[0].constructor == Date) {
         super(options[0]);
      } else if (options.length > 0) {
         super(Date.UTC(...options));
      } else {
         super(Date.UTC());
      }
   }
};

我无法重现您看到的递增行为。您使用的浏览器/环境是什么?我使用的是OSX 10.7.2上的Chrome 17。我编写了一个库,允许覆盖日期构造函数并设置时区以进行测试:谢谢,请参阅我上面的编辑,了解导致该行为的原因。当我有足够的代表时,我会投票。啊,我明白了。所有新建日期共享同一对象,因此对其中一个日期的修改会影响其他日期。我认为我的解决方案是从构造函数中交付一个克隆对象。谢谢你的帮助!谢谢你的建议,但实际上这不是问题所在。请参阅上面的编辑,了解导致该行为的原因。当我有足够的代表@amchang87:在任何情况下line
Date=undefined时,我都会向上投票你的代码没有任何意义。你是个天才:)它在chrome上正常工作。它不适用于IE11,因为它是ES5。任何想法都允许使用Date.now,以在以后继续工作,任何依赖于特定时间的操作都非常漂亮。如果您正在尝试此解决方案,请注意,仅导入库将更改您的
新日期()
结果!仅当您确实想要更改日期时才使用require导入它,或者在您不想调整日期的情况下调用
reset()
(例如,如果您有时使用调试环境变量设置日期,我们的用例)。此外,要使用timemachine,还需要添加.parse(),否则其他库很容易损坏。同样:它在铬上正常工作。它不适用于IE11,因为它是ES5。有什么想法吗
var _f = function(item) { 
   Date.prototype["get" + item] = Date.prototype["getUTC" + item];  
   Date.prototype["set" + item] = Date.prototype["setUTC" + item];  
}
var _d = ['Milliseconds', 'Seconds', 'Minutes', 'Hours', 'Date', 'Month', 'FullYear', 'Year', 'Day'];
_d.forEach(_f);

Date = class extends Date {
   constructor(...options) {
      if (options.length == 1 && options[0].constructor == Date) {
         super(options[0]);
      } else if (options.length > 0) {
         super(Date.UTC(...options));
      } else {
         super(Date.UTC());
      }
   }
};