我有一个使用的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
之后,arg1
和arg2
将是a
,b
,c
,所以我可以'在doAction
处理程序中获取它们。我知道我可以使用引号来保护属性名称以防止它更改,但有没有更好的方法,如特殊的util函数,如:
this.trigger('doAction', MYAPP.util.intoObject{name: 'write', arg1: 1, arg2: 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});