【问题标题】:How does moment.js know when it's object is being serialised?moment.js 如何知道它的对象何时被序列化?
【发布时间】:2013-02-06 03:13:35
【问题描述】:

从 moment.js 文档开始

moment().toJSON();将对象序列化为 JSON 时,如果存在 Moment 对象,它将被表示为一个 ISO8601 字符串。

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

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

【问题讨论】:

    标签: javascript date datetime momentjs


    【解决方案1】:

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

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

    toJSON 行为

    如果一个被字符串化的对象有一个名为 toJSON 的属性 value 是一个函数,那么 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]');
    }
    

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

    【讨论】:

    • 谢谢!使用不需要毫秒的 API,我不知道如何更改 toJSON() 函数格式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 2018-08-01
    相关资源
    最近更新 更多