15

从 moment.js 文档

时刻().toJSON(); 将对象序列化为 JSON 时,如果有 Moment 对象,则表示为 ISO8601 字符串。

JSON.stringify({
    postDate : moment()
}); // {"postDate":"2013-02-04T22:44:30.652Z"}

我不明白 moment 对象如何检测在其上运行的函数。它如何在序列化时返回不同的值,以及简单地存储在对象中或作为字符串返回时?

4

1 回答 1

24

使用 stringify 时,对象可以定义它的表示方式,如本文档所示:

来自https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/JSON/stringify

toJSON 行为

如果被字符串化的对象有一个名为 toJSON 的属性,其值为一个函数,则 toJSON 方法自定义 JSON 字符串化行为:而不是被序列化的对象,调用时 toJSON 方法返回的值将被序列化。

例如:

var x = {
  foo: 'foo',
  toJSON: function () {
    return 'bar';
  }
};
var json = JSON.stringify({x: x});
//json will be the string '{"x":"bar"}'.

moment.js 的文档(见此处:https ://raw.github.com/timrwood/moment/2.0.0/moment.js )表明这确实是受支持的,这里是确切的代码

toJSON : function () {
 return moment.utc(this).format('YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
}

所以,这就是它在被字符串化时如何知道如何表示自己的方式。

于 2013-02-20T23:01:12.177 回答