2012-12-05 2 views
0

Google지도 유틸리티 라이브러리에서 source of InfoBubble을 찾았습니다. 작성자가 점 표기법으로 프로토 타입 메소드를 작성했지만 메소드 정의 끝에 해당 프로토 타입 속성을 대괄호 표기법으로 다시 지정한다는 것을 알았습니다.InfoBubble.js 제작자가 대괄호 표기법을 사용하여 프로토 타입 메서드를 재 할당하는 이유는 무엇입니까?

이 명확해야합니다

/** 
* 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; 

어떤 생각을?

답변

0

나는 그것을 해결했다고 생각합니다.

이 명백한 말도 안돼는 Google Closure 편집과 관련이있는 것으로 보입니다. 당신이 볼 수 있듯이

k.prototype.ma=function(a){this.set("shadowStyle",a)}; 
k.prototype.setShadowStyle=k.prototype.ma; 

, 도트 표기법 .setShadowStyle 내부 호출이 축소 된 양식을 사용하여 가능한 한 간결하게, .ma로 축소 된 가져옵니다

/** 
* 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; 

는에 컴파일합니다.

그러나이 메서드는 Public 메서드이므로 메서드를 원래 이름으로 호출하는 방법을 제공해야합니다. 이것은 컴파일러가 도트 표기법 만 연관시키고 연관 표기법을 최소화함으로써 달성됩니다.

따라서 모두가 행복합니다. 내부 minification 및 외부 접근성.

내가 설명 할 수없는 이유는 컴파일러가 공용 사용을위한 원래 이름을 유지해야한다는 이유만으로 컴파일러가 해결할 수없는 이유입니다. 내가 볼 수있는 한, 메서드의 프리앰블 블록에 @private 태그가 없다는 것을 감지하면 그렇게 할 수 있습니다.

은 미정 :

  • 클로저 컴파일러는 확실히 그 영리한 (아직)이 아니거나
  • 컴파일러 아니었다 클로저 시간 InfoBubble에서 영리가 작성되었습니다 그, 또는
  • 나는 뭔가를 놓친다.

누가 알 수 있습니까?

-2

특정 브라우저에 버그가없는 한 그 이유가 없습니다.