从谷歌地图实用程序库查看InfoBubble的来源时,我发现作者使用点符号创建原型方法,但在方法定义结束时,他使用括号符号重新分配了相同的proto属性。
这应该说明:
/**
* Set the style of the shadow
*
* @param {number} shadowStyle The style of the shadow.
*/
InfoBubble.prototype.setShadowStyle = function(shadowStyle) {
this.set('shadowStyle', shadowStyle);
};
InfoBubble.prototype['setShadowStyle'] = InfoBubble.prototype.setShadowStyle;
知道吗?
我想我已经解决了。
这种明显的无稽之谈似乎与谷歌关闭汇编有关。
/**
* Set the style of the shadow
*
* @param {number} shadowStyle The style of the shadow.
*/
InfoBubble.prototype.setShadowStyle = function(shadowStyle) {
this.set('shadowStyle', shadowStyle);
};
InfoBubble.prototype['setShadowStyle'] = InfoBubble.prototype.setShadowStyle;
编译为:
k.prototype.ma=function(a){this.set("shadowStyle",a)};
k.prototype.setShadowStyle=k.prototype.ma;
正如您所看到的,点符号.setShadowStyle
被缩小为.ma
,通过使用缩小的形式,允许内部调用尽可能简洁。
但是,由于这是一个Public方法,因此有必要提供一种方法,通过其原始名称来调用该方法。这是通过让编译器只最小化点表示法而不最小化关联表示法来实现的。
因此,每个人都是快乐的;内部缩小和外部可访问性。
我无法解释的是,为什么编译器不能简单地自己计算出它需要保留原始名称以供公共使用。据我所见,它可以通过检测方法的前导码块中不存在@private
标签来做到这一点。
也许:
- 闭包编译器还没有那么聪明,或者
- 闭包编译器在编写InfoBubble时并没有那么聪明,或者
- 我错过了什么
谁知道是哪个?
除非某个浏览器中有错误,否则我看不出有什么原因。