为什么InfoBubble.js作者使用括号表示法分配原型方法?

时间:2012-12-05 18:52:49

标签: javascript google-maps infobubble

从Google Maps Utility Library查看source of 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;

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我想我已经解决了。

这种明显的废话似乎与Google Closure编译有关。

/**
 * 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标记来实现。

也许:

  • Closure编译器不是那么聪明(还是)
  • 在编写InfoBubble时,Closure编译器不是,或者
  • 我错过了什么。

谁知道哪个?

答案 1 :(得分:-2)

除非某个浏览器中存在错误,否则我认为没有理由。