2016-04-27 11 views
0

I'vがJSON.parseからオブジェクトobjを得たなぜGoogle Closure Compilerはオブジェクトのプロパティ名の名前を変更しますか?</p> <pre><code>var obj = JSON.parse(some_data); </code></pre> <p>をそして、<code>obj</code>プロパティ<code>x</code>持っていることが想定されています:

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

コンソール出力:

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

ようにあなたが見ると、obj.xが存在します。

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

xプロパティがGに名前が変更された:Googleの閉鎖コンパイラは、次のコードを生成するので、しかしconsole.logの3番目の引数は、それを印刷することができませんでした。それに対処する最良の方法は何ですか? obj["x"]を使用する場合の最初のアイデア。

また、JSON.parseから来ているオブジェクトに対してGxの名前を変更するには、Googleの閉鎖コンパイラのdesigionの背後にある興味深いJSONは、コンパイラするとxが存在する可能性が利用できないことを検討していますか?

答えて

1

differences in the compilation levelsをよく理解してください。特に、プロパティは一貫して参照する必要があります。

JSON.parseのデータ結果は、一般的にコンパイラの外部とみなされますが(必ずしもそうではありませんが)、必ずしもそうとは限りません。たとえば、JSONレスポンスを外部インターフェイスとして定義し、その呼び出しの結果をキャストして、ドット付きプロパティへのアクセスを使用できるようにすることができます。

一般に、プロパティの名前変更はクロージャコンパイラの最も強力な機能の1つで、正しく実装するのが最も難しいものです。あなたのコードは、ADVANCEDのコンパイルと互換性のある方法で書かれなければならないか、破損します。

1

(実際は答えはありませんが、コメントには入りません)

例を表示する必要があります。 Chad Killingsworthが言うように、あなたの結果についてコンパイラにいくつかの型キャストまたはその他の情報を適用している場合、Closure Compilerは名前の変更を行います。

あなたの示したコードに似ていますが、名前の変更は行っていません。 online 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); 

に結果(あなたは「高度」オプションを選択する必要があることに注意してください):予想通り「M」でそのコードの結果が印刷されている実行

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

関連する問題

 関連する問題