前提としてHaxeでは、以下のような文法で構造体 (匿名オブジェクト) を生成することができます。
hoge.hx
class Main {
static function main(){
var user:Dynamic = {
name : "Nicolas",
age : 32
};
}
}
しかし、この記述方法を使用して出力したjavascriptコードをClosure CompilerのADVANCED_OPTIMIZATIONSで圧縮するとオブジェクトのプロパティがリネームされてしまうため、そのプロパティにクォートされた文字列でアクセスするようなロジックがあると正常に動かなくなります。
このような場合には匿名オブジェクトは使用せず、以下のように記述するとで回避できます。
hoge.hx
class Main {
static function main(){
var user:Dynamic = { };
untyped __js__("user['name'] = \"Nicolas\"");
untyped __js__("user['age'] = 32");
}
}
また、外部から読み込んでJSON形式からパースしたオブジェクトにアクセスする場合にも、以下ののように記述すると「response.result」がリネームされてしまうので、
hoge.hx
class Main {
static function main(){
var xhr:XMLHttpRequest = new XMLHttpRequest();
var response:Dynamic = {};
response = Json.parse(xhr.responseText);
var result:String = response.result;
}
}
これも
hoge.hx
class Main {
static function main(){
var xhr:XMLHttpRequest = new XMLHttpRequest();
var response:Dynamic = {};
response = Json.parse(xhr.responseText);
var result:String = untyped __js__("(response['result'] != null) ? response['result'] : null");
}
}
のように記述することでリネームを回避することができます。
js出力したコードを最終的にClosure Compilerで圧縮する際にハマった罠でした。