2013-03-27 5 views
1

개체 내의 콜백 메서드가 있는지 확인하는 함수가 있습니다. 현재 클로저 컴파일러는 메소드 (onClickDisplay 및 onCloseHide)의 이름을 변경하여 makeCallbacks()의 모든 검사가 실패합니다.이름 바꾸기/콜백 메서드 유지 방법

또한

makeCallbacks = function(tobject, methodNames) { 
var callbacks = {}; 

methodNames.each(function(methodName) { 
    if (!tobject[methodName]) { 
    throw new Error(methodName + ' missing from ' + tobject.toString()); 
    } 
    callbacks[methodName] = tobject[methodName].bind(tobject); 
}); 

return callbacks; 
}; 


FeedbackController = Class.create({ 
    initialize: function(id, item) { 
    this.callbacks = makeCallbacks(this, this.callbackNames()); 
    }, 

    observeElements: function() { 
    $$(this.id + ' .closeme').invoke('observe', 'click', this.callbacks.onCloseHide); 
    }, 

    callbackNames: function() { 
    return ['onClickDisplay', 'onCloseHide']; 
    }, 

    onClickDisplay: function(e) { 
    // do something 
    }, 

    onCloseHide: function(e) { 
    // do something 
    } 
}); 
+0

이것은 듣고 싶은 것이 아닐지도 모르지만 대개 단순히 명시 적으로 확인하는 대신 개체에 해당 메서드가 있어야합니다. 필요한 경우 정적으로 입력 된 언어 사용을 고려하십시오. – ThiefMaster

답변

2

당신은 명시 적으로 폐쇄를 알 수 있습니다) (callbackNames의 메소드 이름의 이름을 변경하는 방법 (onClickDisplay 및 onCloseHide)의 이름을 바꾸지하기 위해 폐쇄 컴파일러에게 또는 컴파일러를 알 수있는 방법이 있나요

goog.exportProperty(FeedbackController, 'onClickDisplay', FeedbackController.onClickDisplay); 

또는 사용자 정의 externs이 방법으로 파일을 포함하여 : 컴파일러 수행하여 변수의 이름을 변경하지

function onClickDisplay() {}; 
function onCloseHide() {}; 

및 폐쇄 컴파일러가 제공 16,:

"--externs=/externs/externs.js" 

이 변수 이름을 변경하는 것을 방지합니다. 일반적으로 외부 라이브러리와 상호 작용하기 위해서만 이것을 사용합니다.

소스 : Closure the Definitive Guide

1

당신이 ADVANCED_OPTIMIZATIONS와 폐쇄 컴파일러의 중심 요구 사항 중 하나 위반 사용하는 코딩 스타일 : 일치하는 속성 액세스를. 즉 점으로 찍힌 표기법 obj.prop과 인용 부호 obj['prop']을 사용하여 동일한 속성을 참조 할 수 없습니다. Class.create 호출에 전달 된 속성 이름을 인용 할 수는 있지만 데드 코드 제거 및 유형 검사는 무효화됩니다. 이러한 행동을 원하지 않으면 SIMPLE_OPTIMIZATIONS을 (를) 실제로 사용해야합니다.

클로저 컴파일러가 Class.create이 속성을 할당하고 있음을 인식하지 못하기 때문에 코드에서 FeedbackController의 속성을 정의했다는 사실을 숨기고 있습니다.

코딩 스타일을 변경하려는 경우가 아니라면 SIMPLE_OPTIMIZATIONS을 (를) 사용하는 것이 좋습니다.

최적화 수준 간의 결정 요인에 대한 자세한 내용은 내 Which Compilation Level is Right for Me? 게시물을 참조하십시오.

+0

tobject.toString()을 참조하는 경우 toString()은 실제로 컴파일러에서 인식하는 PrototypeJS 함수입니다. 귀하의 의견을 주셔서 감사합니다. 매우 감사. – Chris