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引擎的本机源代码。
任何方法可以覆盖行为以获得所需的结果?
它取决于控制台的实现,该实现不在V8中,而是在主机中(Chrome,Chromium,Node.js,...(。
node.js曾经寻找一个称为 inspect
的成员(至少在v4中返回(,如果存在,则使用它,但事实证明这是一个兼容性问题,它不再这样做。
我认为再也没有任何方法可以覆盖控制台的内置对象的渲染,尤其是不在主机环境中。
控制台使用 toString
将日期(和其他对象(转换为打印的字符串。因此,您可以覆盖Date.prototype.toString
来更改打印的内容。演示(从Chrome Console会话中复制(:
> 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
对象未覆盖Ecmasixp Spec,因此每个嵌入器都可以提供他们认为在那里有用的任何东西。node.js使用util.format
,这又使用util.inspect
,进而从原始Date.prototype
获取toISOString
功能,这意味着您不能覆盖它(这是一个功能,因为这意味着您不能破坏它或限制它因为这意味着您无法自定义,具体取决于您的观点(。
在执行Console.log((时,您不会将新date((转换为json。您可以这样写。
Date.prototype.toJSON = function(){ return this.toLocaleString(); }
console.log({a:JSON.stringify(new Date())})