我从obj
获得了一个对象JSON.parse
:
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
的第三个参数未能打印出来,因为Google Closure Compiler生成了以下代码:
console.log("Z ",a,a.G);
x
属性已重命名为G
。处理这个问题的最佳方法是什么?第一个想法是否使用obj["x"]
。
对于来自x
的对象,Google Closure编译器将G
重命名为JSON.parse
的设计背后也很有趣,因为JSON不可用于编译器和x
可能存在吗?
答案 0 :(得分:2)
确保您了解differences in the compilation levels。具体而言,必须一致地引用属性。
JSON.parse数据结果通常被认为是编译器的外部(如您所述) - 但并非总是如此。例如,您可以将JSON响应定义为外部接口,并键入来自该调用的结果,这将允许您使用点属性访问。
通常,属性重命名是闭包编译器最强大的功能之一,也是最难以正确实现的。您的代码必须以与ADVANCED
编译兼容的方式编写,否则将中断。
答案 1 :(得分: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”按预期打印。