можно ли настроить глобальную функцию даты?

#javascript #prototype

#javascript #прототип

Вопрос:

Я пытаюсь настроить глобальную Date функцию, сохранив все функциональные Date возможности, но добавив некоторую проверку параметров внутри конструктора

потому что я хочу выдать ошибку при вызове Date подобной функции new Date('2021-01-01') , которая вернется Invalid Date в safari.

 (function () {
  let OldDate = window.Date;
  window.Date = class Date extends (
    OldDate
  ) {
    constructor(...args) {
      if (/dddd-dd-dd dd:dd:dd/.test(args[0])) {
        throw Error('wrong date format');
      }
      super(...args);
    }
  };
})();
 

но у этого подхода есть подводный камень, я не могу позвонить Date без new ключевого слова

 // before override
new Date('2021/02/01'); // OK
Date('2021/02/01'); // OK

// after override
new Date('2021/02/01'); // OK
Date('2021/02/01'); // Uncaught TypeError: Class constructor Date cannot be invoked without 'new'
 

Как мне это исправить?

мотивация настройки глобальной Date функции

большинство новичков склонны вызывать Date функцию в формате, например YYYY-MM-DD HH:mm:ss , это работает в его среде разработки (последняя версия Chrome), и он не знает, что это не будет работать в Safari, пока он не протестирует свой проект в safari, поэтому я должен сказать ему, чтобы он менял строку формата даты, которую он использует каждый разон попадает в эту проблему.

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

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

 new Date('2021-01-02') // Error: 'YYYY-MM-DD is wrong format', try use 'YYYY/MM/DD'
 

Комментарии:

1. » Я пытаюсь переписать глобальную » не делайте этого! » но этот подход не работает хорошо, потому что теперь все статические методы Date отсутствуют » угадайте, почему ИЗМЕНЕНИЕ ГЛОБАЛЬНОГО ОБЪЕКТА может быть плохой идеей.

2. » но этот подход плохо работает » — это не просто статические методы, они даже new Date() больше не работают.

3. @VLAZ Я знаю, насколько плоха идея «ИЗМЕНИТЬ ГЛОБАЛЬНЫЙ ОБЪЕКТ», я просто говорю о возможности, в качестве технического обсуждения я обновил свой вопрос.

4. @Littlee, что ты имеешь в виду call Date without new keyword ? Вы хотите вызвать статический член Date ? Вы привели пример new Date('2021-01-01') . Итак, вы хотите вызвать члены экземпляра и статические члены Date ?

5. @Wenbo я хочу создать new Date('2021/02/01') и Date('2021/02/01') оба являются допустимыми выражениями

Ответ №1:

Неважно, почему вы хотите переопределить дату. Мое решение

 var originalDate = Date; // backup

function _date(str) {
    // your implementation here
    if (/dddd-dd-dd dd:dd:dd/.test(str)) {
        throw Error('wrong date format');
    }
    return new originalDate(str);
}

window.Date = _date; // override

Object.assign(Date.prototype, originalDate.prototype); // I suppose you still want to have properties of the original Date.