Как знает момент .js, когда объект сериализуется?

С момента .js docs

.

момент() toJSON(); При сериализации объекта в JSON, если есть Moment, он будет представлен как строка ISO8601.

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

Я не понимаю, как объект момента может обнаружить функцию, действующую на нем. Как он может возвращать другое значение при сериализации и когда он просто хранится в объекте или возвращается в виде строки?

Ответы

Ответ 1

При использовании stringify объект может определить, как он будет представлен, как показано в этой документации:

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

toJSON поведение

If an object being stringified has a property named toJSON whose 
value is a function, then the toJSON method customizes JSON stringification 
behavior: instead of the object being serialized, the value returned by the 
toJSON method when called will be serialized. 
For example:
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]');
}

Таким образом, это то, как он осознает, как представлять себя при строчении.