2017-05-09 10 views
-3

なぜAngular2がJSON.stringifyをオーバーライドするのですか?Angular2 JSON.stringify

私は自分のDate.toJSONをオーバーライドしましたが、オブジェクトを文字列化するときは呼び出されません。

これは正しく動作しますが、角度アプリでは機能しません!

<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仕様では、このようなカスタムオブジェクトでJSON.stringifyが使用する独自の.toJson()メソッドを提供できます。ただし、すべての図書館のベンダー(またはブラウザー・ベンダー)がこの機能を提供しているわけではありません。

幸いにも回避策はかなり簡単です。オブジェクトを受け取るとすぐに独自の.toJson()メソッドを提供/添付したり、オブジェクトのプロパティをpojo(普通の古いjavascriptオブジェクト)に 'コピー'することができます。 pojoを扱うと、JSON.stringifyはうまく機能します。しかし、オブジェクトのすべての子プロパティがネイティブデータ型またはポーズとしてコピーされるように注意してください。