2017-05-09 45 views
-3

爲什麼Angular2重寫JSON.stringify!?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

你在angular2中做了什麼?請分享 –

+0

我沒有看到你在調用'Date.toJSON()'函數。我看到你在哪裏使用'JSON.stringify()'和'date.toISOString()'。 – birwin

+0

JSON.stringify必須調用Date.toJSON()我是對的!? – user2638209

回答

2

JSON.stringify只會複製那些對象自身的屬性的屬性 - 即對象的「頂級」的屬性。如果你有一個複雜的JavaScript對象使用原型繼承,它不會複製原型鏈的屬性。

基本上,一旦你處理特定類型的對象(用函數構造函數創建),你不能相信JSON.stringify會做你期望的。 JSON規範確實允許像這樣的自定義對象提供他們自己的.toJson()方法,JSON.stringify將使用它。然而,並非所有的圖書館供應商(或瀏覽器供應商)都懶得提供此功能。

幸運的是,解決方法非常簡單。您可以提供/附加您自己的.toJson()方法,或者只要您收到對象,就自己將對象的屬性複製到pojo(普通的舊JavaScript對象)中。一旦你處理了一個pojo,JSON.stringify就可以很好地工作。但要小心,將對象的所有子屬性作爲本機數據類型或pojos進行復制。