2016-04-27 77 views
0

心中已經從一個JSON.parse得到了一個對象obj爲什麼Google Closure Compiler會重命名對象的屬性名稱?

var obj = JSON.parse(some_data); 

而且假定obj有一個屬性x

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

控制檯輸出:

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

由於你看,obj.x存在。但console.log的第三個參數打印失敗,是因爲谷歌關閉編譯器產生下面的代碼:

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

x屬性被重命名爲G。處理這個問題的最好方法是什麼?第一個想法是否使用obj["x"]

這也是有趣的東西是谷歌關閉編譯器的desigion重命名xG爲來自JSON.parse,考慮到JSON是不可用的編譯器和x可能存在有後面的對象?

回答

1

確保您瞭解differences in the compilation levels。具體而言,屬性必須一致地引用。

JSON.parse數據結果通常被認爲是編譯器外部的(正如您注意到的那樣) - 但並非總是如此。例如,您可以將您的JSON響應定義爲外部接口,並鍵入將該調用的結果轉換爲允許使用虛線屬性訪問的結果。

一般來說,屬性重命名是閉包編譯器最強大的功能之一,也是最難正確實現的。您的代碼必須以符合ADVANCED編譯的方式編寫,否則將會中斷。

1

(不是一個真正的答案,但這不適合評論)。

您需要顯示一個或多個代碼示例。正如Chad Killingsworth所說,如果您正在向編譯器應用某種類型轉換或其他信息以獲得您的結果,那麼Closure Compiler將進行重命名。

下面是與您顯示的內容類似的示例代碼,但它未進行重命名。

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); 

online Closure Compiler(請注意,您需要選擇「高級」選項)的結果編譯如下:

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

運行中的「M」的代碼結果如預期進行打印。