为什么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>
答案 0 :(得分:2)
JSON.stringify只会复制属于对象'自己'属性的属性 - 即该对象的“顶级”属性。如果你有一个使用原型继承的复杂javascript对象,它将不会复制来自原型链的属性。
基本上,一旦处理了特定类型的对象(使用函数构造函数创建),就不能相信JSON.stringify会按预期执行。 JSON规范允许这样的自定义对象提供自己的.toJson()方法,JSON.stringify将使用它。但并非所有图书馆供应商(或浏览器供应商)都愿意提供此功能。
幸运的是,解决方法非常简单。您可以提供/附加自己的.toJson()方法,或者在收到对象后立即将对象的属性“复制”到pojo(普通的旧javascript对象)中。一旦你处理了一个pojo,JSON.stringify就能很好地工作。但请注意,对象的所有子属性都将作为本机数据类型或pojos复制。