Javascript 为什么谷歌闭包编译器重命名对象的属性名?

Javascript 为什么谷歌闭包编译器重命名对象的属性名?,javascript,json,obfuscation,google-closure-compiler,Javascript,Json,Obfuscation,Google Closure Compiler,我从JSON.parse中获得了一个对象obj: 假设obj有一个属性x: 控制台输出: Z Object {x: "m", n: Array[256], t: Array[256], v: Array[256]} undefined 如您所见,obj.x是存在的。但是console.log的第三个参数无法打印它,因为Google Closure编译器生成了以下代码: console.log("Z ",a,a.G); x属性被重命名为G。处理这个问题的最佳方法是什么?第一个想法是使用obj

我从JSON.parse中获得了一个对象obj:

假设obj有一个属性x:

控制台输出:

Z  Object {x: "m", n: Array[256], t: Array[256], v: Array[256]} undefined
如您所见,obj.x是存在的。但是console.log的第三个参数无法打印它,因为Google Closure编译器生成了以下代码:

console.log("Z ",a,a.G);
x属性被重命名为G。处理这个问题的最佳方法是什么?第一个想法是使用obj[x]


同样有趣的是,Google Closure编译器决定将JSON.parse中的对象的x重命名为G,考虑到编译器无法使用JSON,并且x可能存在于该对象中,这背后的原因是什么。具体而言,必须一致地引用属性

正如您所指出的,JSON.parse数据结果通常被认为是编译器的外部结果,但并不总是如此。例如,您可以将JSON响应定义为一个外部接口,并输入该调用的结果,这将允许您使用点式属性访问


一般来说,属性重命名是闭包编译器最强大的功能之一,也是最难正确实现的功能之一。您的代码必须以与高级编译兼容的方式编写,否则代码将被破坏。

这不是一个真正的答案,但不适合作为注释

您需要显示一个示例或更多代码。正如Chad Killingsworth所说,如果您正在向编译器应用一些类型转换或其他有关结果的信息,那么闭包编译器将进行重命名

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);
下面是与您展示的代码类似的示例代码,但它没有进行重命名

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);
编译此文件时请注意,您需要选择“高级”选项,结果是:

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

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