为什么 Google 闭包编译器会重命名对象的属性名称
Why does Google Closure Compiler rename object's properties names?
我从JSON.parse
中obj
了一个对象:
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
可能存在,将来自 JSON.parse
的对象重命名为G
,Google闭包编译器将x
重命名为的背后是什么?
确保您了解编译级别的差异。具体而言,必须一致地引用属性。
JSON.parse 数据结果通常被视为编译器外部(如您所指出的) - 但并非总是如此。例如,您可以将 JSON 响应定义为外部接口,并键入该调用的结果,这将允许您使用点属性访问。
通常,属性重命名是闭包编译器最强大的功能之一,也是最难正确实现的功能。代码必须以与编译兼容的方式编写ADVANCED
否则会中断。
(不是真正的答案,但这不适合评论)。
您需要显示一个示例或更多代码。 正如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);
使用在线闭包编译器编译它(请注意,您需要选择"高级"选项)会导致:
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"。
相关文章:
- 为什么我可以在Array属性对象中找到Javascript Array for Each方法
- 使用onclick调用属性对象函数
- 嵌套为..in 循环,列出多维对象的属性(对象)
- 动态属性对象 - JSON
- 在不使用隔离范围angularjs自定义指令的情况下获取属性对象
- 通过属性传递属性/对象.Javascript
- Javascript:属性/对象的类型
- 访问JSON中的属性(对象)
- 属性对象Javascript不是用Jquery Deferred设置的
- 无法读取属性'#<对象>'未定义的获取错误
- Twitter中多属性对象的子字符串匹配
- 无法设置'data'属性'对象'标记.(只IE8)
- 更新数据属性对象属性值
- 将属性对象的选定对象从原型推入数组
- 将单个属性对象字面量的数组转换为仅包含其值的数组的最佳方法
- 寻找一种更简单的方法来检查是否多个属性&对象中的方法是未定义的
- 主干模型:带有get方法的空属性,但在属性对象中
- 如何赋值给"text"someText"属性对象在动能js
- Angularjs的数据绑定与数据属性对象
- 如何将一个嵌套的javascript对象转换为只有一级属性对象