2017-07-19 12 views
0

高度な最適化を使用するGoogleクロージャコンパイラではプロパティの名前が変更されますが、他のプロパティは変更されないことが記載されています。しかし、そこには次のコードでは、「ID」と「可視性」プロパティの名前を変更するために失敗した理由として何の説明もないように思われる:Googleクロージャコンパイラで一部のプロパティの名前が変更されない

const model = { 
    age: 5, 
    id: 1234, 
    visibility: true, 
    skills: 4, 
    hair: 667 
} 


function doSomething() { 
    var s = Object.create(model); 
    console.log("Age: " + model.age); 

    s.visibility = "john"; 
    s.age = 2; 
    s.skills = 5; 
    s.hair = 999; 

    model.age = 6; 
    return s; 
} 

doSomething(); 

をそして、これはコンパイラの設定です:

java -jar closure-compiler/compiler.jar \ 
    --compilation_level ADVANCED_OPTIMIZATIONS \ 
    --js_output_file scripts/release/test-min.js \ 
    --warning_level VERBOSE \ 
    --language_out ECMASCRIPT5 \ 
    --language_in=ES6_Strict \ 
    --js scripts/temp/test.js 

エクスターナルがないことに気づくでしょう。

答えて

1

クロージャコンパイラは、安全に行うことができると考えられる場合にのみアイテムの名前を変更します。コンパイラはプロパティがにexternオブジェクト上に存在する場合でも、名前を変更するのに十分な型情報を持つ任意のexternオブジェクト

  • プロパティに存在しない

    • プロパティ名:名前を変更することができるプロパティの2種類があります。

    idおよびvisibilityは、両方ともデフォルトのエクスターナルのプロパティとして存在します。したがって、十分な型情報がない限り、名前を変更することはできません。

    オブジェクトが不明な型を持ち、同じ名前のプロパティを持つオブジェクトがあれば、型に基づいた名前の変更はその名前を変更しません。この不明なプロパティは、デフォルトのexterns内にある場合もあります。

    コンパイラは、匿名オブジェクトよりも実際のクラスの名前を変更するほうがはるかに優れています。 modelと実際のクラスを作るとどうなるか見てみてください。

  • +0

    デフォルトのexternを使用していることに気付かなかった。ありがとう! Googleの検索で、デフォルトのexternsに関する結果が得られました:https://github.com/google/closure-compiler/wiki/FAQ – AndroidDev