Переопределение конструктора даты Javascript?

Я разрабатываю приложение браузера, которое чувствительно к текущей дате.

В коде моего приложения я вызываю new Date и выполняю вычисления на основе текущего времени и соответствующим образом визуализирую представление.

Чтобы протестировать свое приложение для различных возможных календарных дней, мне пришлось бы постоянно переводить системные часы на прошлое или будущее, что раздражает и, вероятно, вредно для моего компьютера.

Итак, чисто для целей тестирования (я никогда не стал бы использовать этот код в производстве), я решил переопределить встроенный конструктор 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)

... и так далее ....

У меня вопрос, что именно здесь происходит?

Если я переопределил конструктор для возврата статической даты, почему он дает несвязанные и постоянно увеличивающиеся даты?

Кроме того, есть ли эффективный способ переопределить конструктор Date для возврата статической даты в будущем без необходимости выполнять все вызовы создания экземпляров даты в моем коде и изменять вывод ?

Заранее спасибо.

РЕДАКТИРОВАТЬ:

Я попробовал свой код в новом окне, и он работал, как ожидалось.

Похоже, виновником был плагин jQuery UI datepicker, который вызывал свой метод «обновления». Когда я отключаю его вызов, переопределение даты работает нормально, но как только я использую datepicker, возникает странное поведение, указанное выше.

Понятия не имею, почему этот популярный плагин каким-то образом повлиял на что-то вроде этого. Если у кого-то есть идеи, дайте мне знать.

Извините за то, что не выяснил истинного виновника ранее.

9
задан Dan 19 January 2012 в 07:42
поделиться

1 ответ

Я использовал ниже для осуществления дат 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());
      }
   }
};
0
ответ дан 4 December 2019 в 07:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: