Почему автор InfoBubble.js переназначает методы прототипа с помощью скобок?
Из библиотеки служебных программ Google Maps, глядя на источник 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 ответа
Я думаю, что я решил это.
Эта кажущаяся ерунда, похоже, связана с компиляцией 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 не совсем умный (пока), или
- Компилятор Closure не был настолько умным во время написания InfoBubble, или
- Я что-то упустил.
Кто знает какой?
Если в определенном браузере нет ошибки, я не вижу причин для этого.