2017-05-09 5 views
-3

Warum Angular2 JSON.stringify überschreiben?Angular2 JSON.stringify

Ich habe mein eigenes Date.toJSON überschreiben, aber es wird nicht aufgerufen, wenn ein Objekt zu string.

Im folgenden Beispiel funktioniert es richtig, aber es funktioniert nicht in 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

was hast du in angular2 gemacht? Bitte teilen Sie das auch –

+0

Ich sehe nicht, wo Sie Ihre 'Date.toJSON()' Funktion aufrufen. Ich sehe, wo Sie 'JSON.stringify()' und 'date.toISOString()' verwenden. – birwin

+0

JSON.stringify muss Date.toJSON() aufrufen Ich habe Recht!? – user2638209

Antwort

2

JSON.stringify kopiert nur Eigenschaften, die die Objekte ‚eigenen‘ Eigenschaften sind - also die ‚Top-Level‘ Eigenschaften dieses Objekts. Wenn Sie ein komplexes JavaScript-Objekt verwenden, das eine prototypische Vererbung verwendet, werden KEINE Eigenschaften kopiert, die aus der Prototypkette stammen.

Wenn Sie mit Objekten eines bestimmten Typs (mit Funktionskonstruktoren) arbeiten, können Sie nicht darauf vertrauen, dass JSON.stringify das tut, was Sie erwarten. Die JSON-Spezifikationen erlauben es, dass benutzerdefinierte Objekte wie diese ihre eigene .toJson() -Methode bereitstellen, die JSON.stringify verwenden wird. Nicht alle Bibliotheksanbieter (oder Browser-Anbieter) sind jedoch bemüht, diese Funktion bereitzustellen.

Glücklicherweise ist die Problemumgehung ziemlich einfach. Sie können Ihre eigene .toJson() - Methode bereitstellen/anhängen oder die Eigenschaften des Objekts selbst in ein Pojo (einfaches altes JavaScript-Objekt) kopieren, sobald Sie das Objekt erhalten. Sobald Sie mit einem Pojo fertig werden, funktioniert JSON.stringify wunderbar. Aber seien Sie vorsichtig, dass ALLE untergeordneten Eigenschaften des Objekts als native Datentypen oder pojos kopiert werden.