#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.