【问题标题】:Angular2 JSON.stringifyAngular2 JSON.stringify
【发布时间】:2017-10-08 02:13:40
【问题描述】:

为什么 Angular2 会覆盖 JSON.stringify !?

我已经覆盖了我自己的 Date.toJSON,但是在对对象进行字符串化时不会调用它。

在下面的例子中它可以正常工作,但在 Angular App 中它不能工作!

<html>
  
  <body>
    
    Custom Date Fomat : <span id="date1"></span><br>
    ISO Date Format : <span id="date2"></span>
  
  </body>
  
  <script>
    Date.prototype.toJSON = function(){
      var day = date.getDate();
      var month = date.getMonth() + 1;
      var year = date.getFullYear();

      var s =  year + "-" + 
        (month > 9 ? "" : "0") + month + "-" + 
        (day   > 9 ? "" : "0") + day   + "T00:00:00.000Z";

      return s;
    }
  
    var date = new Date();
    document.getElementById("date1").innerHTML = JSON.stringify({date});
    document.getElementById("date2").innerHTML = date.toISOString();
  
  </script>

</html>

【问题讨论】:

  • 你在angular2做了什么?请也分享一下
  • 我看不到你在哪里调用你的 Date.toJSON() 函数。我知道你在哪里使用 JSON.stringify()date.toISOString()
  • JSON.stringify 必须调用 Date.toJSON() 我是对的!?

标签: json angular date stringify


【解决方案1】:

JSON.stringify 只会复制对象“拥有”属性的属性——即该对象的“顶级”属性。如果您有一个使用原型继承的复杂 javascript 对象,它不会复制原型链中的属性。

基本上,一旦您处理特定类型的对象(使用函数构造函数创建),您就不能相信 JSON.stringify 会按照您的预期进行。 JSON 规范确实允许像这样的自定义对象提供自己的 .toJson() 方法,JSON.stringify 将使用该方法。然而,并非所有库供应商(或浏览器供应商)都愿意提供此功能。

幸运的是,解决方法非常简单。您可以提供/附加自己的 .toJson() 方法,或者在收到对象后立即将对象的属性“复制”到 pojo(普通的旧 javascript 对象)中。一旦你处理了一个 pojo,JSON.stringify 就可以很好地工作。但请注意,对象的所有子属性都被复制为原生数据类型或 pojo。

【讨论】:

    猜你喜欢
    • 2016-12-02
    • 2018-11-24
    • 2011-10-08
    • 2014-01-13
    • 2011-11-07
    • 2014-01-21
    • 2014-09-08
    • 1970-01-01
    • 2015-02-24
    相关资源
    最近更新 更多