Как console.log преобразует объект даты в формате JavaScript в понятный человеку формат - PullRequest
2 голосов
/ 19 мая 2019

Выход console.log({a:new Date()}) равен { a: 2019-05-19T11:30:57.514Z }

Значение JSON.stringify({a:new Date()}) равно {"a":"2019-05-19T11:33:12.591Z"}

После переопределения этого: Date.prototype.toJSON = function(){ return this.toLocaleString(); }

Значение JSON.stringify({a:new Date()}) равно {"a":"5/19/2019, 5:09:31 PM"}

Но вывод console.log({a:new Date()}) по-прежнему { a: 2019-05-19T11:41:31.256Z }

Попробовал переопределить другие Date.prototype методы, такие как toISOString(), toSource, toString, toUTCString, valueOf и многие другие. Но никто не помог.

Не удалось понять исходный код движка v8 js.

Есть ли способ переопределить поведение, чтобы получить желаемый результат?

Ответы [ 3 ]

2 голосов
/ 19 мая 2019

Это зависит от реализации консоли, которая не в V8, а скорее в хосте (Chrome, Chromium, Node.js, ...).

Node.js использовал для поиска члена с именем inspect (по крайней мере, в v4) и использовал его, если он присутствовал, но это оказалось проблемой совместимости, и он больше этого не делает.

Я не думаю, что есть какой-либо способ переопределить консольный рендеринг встроенных объектов, особенно не в хост-средах.

0 голосов
/ 19 мая 2019

Консоль использует toString для преобразования дат (и других объектов) в строку для печати. Таким образом, вы можете переопределить Date.prototype.toString, чтобы изменить то, что печатается. Демонстрация (скопированная из сеанса консоли Chrome):

> var d = new Date()
> console.log(d)
< Sun May 19 2019 14:29:02 GMT+0200 (Central European Summer Time)
> Date.prototype.toString = Date.prototype.toLocaleString
< ƒ toLocaleString() { [native code] }
> console.log(d)
< 5/19/2019, 2:29:02 PM
> console.log({a:new Date()})
< {a: 5/19/2019, 2:31:21 PM}

Отдельная проблема заключается в том, что JSON.stringify({a: 1}) дает {"a":1}, тогда как console.log({a: 1}) печатает {a: 1} (без кавычек вокруг a). Это не связано с датами и связано с тем, что JSON является очень ограниченным подмножеством JavaScript ({a: 1} является допустимым JavaScript, но не допустимым JSON). Кроме того, console.log предназначен для потребления человеком, не требуется, чтобы выходные данные могли быть проанализированы обратно к исходному объекту (объектам) - просто посмотрите, что console.log(new Array(100)) делает: -)


Редактировать: вышесказанное верно для Chrome. Поскольку объект console не охватывается спецификацией ECMAScript, каждый встроенный модуль может предоставить там все, что он считает полезным. Node.js использует util.format, который, в свою очередь, использует util.inspect, который, в свою очередь, получает toISOString функцию от изначальной Date.prototype, что означает, что вы не можете переопределить его (что является функцией, потому что это означает, что вы не можете ее сломать, или ограничением, потому что это означает, что вы не можете настроить его, в зависимости от вашей точки зрения).

0 голосов
/ 19 мая 2019

Вы не конвертируете новую дату () в json, когда выполняете console.log ().Вы можете написать это так.

Date.prototype.toJSON = function(){ return this.toLocaleString(); }
console.log({a:JSON.stringify(new Date())})
...