2016-04-27 9 views
0

I'v bekam ein Objekt obj von einem JSON.parse:Warum benennt Google Closure Compiler Objekteigenschaftennamen um?

var obj = JSON.parse(some_data); 

Und es wird angenommen, dass obj eine Eigenschaft x hat:

console.log('Z', obj, obj.x); 

Die Konsolenausgabe:

Z Object {x: "m", n: Array[256], t: Array[256], v: Array[256]} undefined 

Wie Sie sehen, obj.x existiert. Aber das dritte Argument von console.log gescheitert, es zu drucken, weil Google Closure Compiler den folgenden Code erzeugt:

console.log("Z ",a,a.G); 

Die x Eigenschaft G umbenannt. Was ist der beste Weg, damit umzugehen? Die erste Idee, wenn obj["x"] zu verwenden ist.

Es ist interessant, auch das, was hinter dem Google Closure Compiler des desigion ist x-G für das Objekt zu benennen, die von JSON.parse kommt, wenn man bedenkt, dass JSON nicht verfügbar ist Compiler und x kann es existieren?

Antwort

1

Stellen Sie sicher, dass Sie die differences in the compilation levels verstehen. Insbesondere müssen Eigenschaften konsistent referenziert werden.

JSON.parse Daten Ergebnisse werden im Allgemeinen als extern zum Compiler (wie Sie notiert) - aber nicht immer. Zum Beispiel könnten Sie Ihre JSON-Antwort als externe Schnittstelle definieren und die Ergebnisse aus diesem Aufruf umwandeln, um den Zugriff auf gepunktete Eigenschaften zu ermöglichen.

Im Allgemeinen ist die Umbenennung von Eigenschaften eine der leistungsstärksten Funktionen von Closing-Compiler und auch die am schwierigsten zu implementierende. Ihr Code muss in einer Weise geschrieben sein, die kompatibel mit ADVANCED Kompilierung ist oder es wird brechen.

1

(nicht wirklich eine Antwort, aber das wird nicht in einen Kommentar passen).

Sie müssen ein Beispiel oder mehr von Ihrem Code zeigen. Wie Chad Killingsworth sagt, wenn Sie eine Art Cast oder andere Informationen an den Compiler über Ihre Ergebnisse anwenden, wird Closure Compiler umbenennen.

Hier ist Beispielcode ähnlich wie Sie gezeigt haben, aber es macht nicht die Umbenennung.

var orig_obj = { x: "m", 
n: new Array(256), 
t: new Array(256), 
v: new Array(256)}; 
var some_data = JSON.stringify(orig_obj); 
var obj = JSON.parse(some_data); 
console.log('Z', obj, obj.x); 

Kompilieren dies mit der online Closure Compiler (Anmerkung, die Sie brauchen "Erweitert" Option wählen) in Ergebnisse:

a=JSON.stringify({x:"m",n:Array(256),t:Array(256),a:Array(256)}), 
b=JSON.parse(a);console.log("Z",b,b.x); 

, dass Code Ergebnisse in dem "m" Laufen ist wie erwartet gedruckt.

Verwandte Themen