2

我有一个使用类似于以下方法的 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将是 , , ,所以我无法在处理程序中获取它们。我知道我可以对属性名称使用引号来防止它发生变化,但是有没有更好的方法,比如特殊的 util 函数,比如:arg1arg2abcdoAction

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

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

4

2 回答 2

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}));
于 2013-03-31T01:55:00.923 回答
0

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

所以上面的代码会变成:

this.trigger('doAction', {'name': 'write', 'arg1': 1, 'arg2': 2});
于 2013-11-12T20:56:36.837 回答