如何解决Closure Compiler中对象属性的重命名?

时间:2013-03-29 06:40:00

标签: javascript obfuscation google-closure-compiler

我有一个使用的JS库有类似下面的方法:

this.on('doAction', function (args) {
   console.log(args.name);
   console.log(args.arg1 + ' ' 9 args.arg2);
});
this.trigger('doAction', {name: 'write', arg1: 1, arg2: 2});

但是在高级优化对象属性name之后,arg1arg2将是abc,所以我可以'在doAction处理程序中获取它们。我知道我可以使用引号来保护属性名称以防止它更改,但有没有更好的方法,如特殊的util函数,如:

this.trigger('doAction', MYAPP.util.intoObject{name: 'write', arg1: 1, arg2: 2});

允许我保存对象属性名称吗?

2 个答案:

答案 0 :(得分:3)

应该始终重命名属性。例如,您的示例编译为:

this.c("doAction", function(a) {
  console.log(a.name);
  console.log(a.a + " " + a.b)
});
this.d("doAction", {name:"write", a:1, b:2});

您可以看到以非破坏方式重命名属性。除非启用基于实验类型的优化,否则始终会出现这种情况,但即使这样,也应妥善处理此特定情况。

如果您需要绝对不重命名属性,可以在extern文件中定义一个接口,并将您的方法类型转换为该类型。

/** @externs */
/** @interface */
function myInterface() {}
/** @type {number} */
myInterface.prototype.arg1 = 0;

在你的例子中:

this.on('doAction', /** @param {myInterface} args */  function (args) {
   console.log(args.name);
   console.log(args.arg1 + ' ' + args.arg2);
});
this.trigger('doAction',
  /** @type {myInterface} */ ({name: 'write', arg1: 1, arg2: 2}));

答案 1 :(得分:0)

我在使用需要基于对象的属性的jquery方法时遇到了这个问题。我通过将所有键名放在引号中来解决它,然后闭包编译器没有弄乱它们。

所以上面的代码将成为:

this.trigger('doAction', {'name': 'write', 'arg1': 1, 'arg2': 2});