The Revealing Module Pattern
이제 우리는 모듈 패턴에 좀 더 익숙해졌으므로 약간 개선 된 버전 인 Christian Heilmann의 Revealing Module 패턴을 살펴 보겠습니다.
Reilaling Module 패턴은 Heilmann이 다른 객체에서 하나의 public 메소드를 호출하거나 public 변수에 액세스하려고 할 때 주 객체의 이름을 반복해야 한다는 사실에 실망감을 나타냈습니다. 그는 또한 그가 공개하고 싶은 것들에 대한 객체 리터럴 표기법으로 전환해야한다는 모듈 패턴의 요구 사항을 싫어했습니다.
그의 노력의 결과는 업데이트 된 module 패턴이었습니다. 여기서 우리는 단순히 우리의 모든 함수와 변수를 private 범위 내에서 정의하고 공개적으로 드러내고 싶은 private 기능에 대한 포인터를 가진 익명의 객체를 리턴합니다.
Revealing Module pattern을 사용하는 방법의 예는 아래에서 확인할 수 있습니다.
var myRevealingModule = (function () {
var privateVar = "Ben Cherry",
publicVar = "Hey there!";
function privateFunction() {
console.log( "Name:" + privateVar );
}
function publicSetName( strName ) {
privateVar = strName;
}
function publicGetName() {
privateFunction();
}
// Reveal public pointers to
// private functions and properties
return {
setName: publicSetName,
greeting: publicVar,
getName: publicGetName
};
})();
myRevealingModule.setName( "Paul Kinlan" );
이 패턴은 또한 우리가 선호한다면 더 구체적인 명명 체계를 사용하여 private 기능과 속성을 드러내기 위해 사용될 수 있습니다 :
var myRevealingModule = (function () {
var privateCounter = 0;
function privateFunction() {
privateCounter++;
}
function publicFunction() {
publicIncrement();
}
function publicIncrement() {
privateFunction();
}
function publicGetCount(){
return privateCounter;
}
// Reveal public pointers to
// private functions and properties
return {
start: publicFunction,
increment: publicIncrement,
count: publicGetCount
};
})();
myRevealingModule.start();
장점
이 패턴을 사용하면 스크립트의 구문을보다 일관성있게 유지할 수 있습니다. 또한 모듈의 끝 부분에서 우리 함수와 변수 중 어떤 것이 공개적으로 접근되어 가독성을 쉽게하는지 명확하게 해줍니다.
단점
이 패턴의 단점은 개인 함수가 공용 함수를 참조하는 경우 패치가 필요한 경우 해당 공용 함수를 재정의 할 수 없다는 것입니다. 이는 개인 함수가 개인 구현을 계속 참조하고 패턴이 공용 멤버에는 적용되지 않고 함수에만 적용되기 때문입니다.
private 변수를 참조하는 public object 멤버는 위의 무 패치 규칙 노트의 적용을받습니다.
결과적으로, Revealing Module 패턴으로 생성 된 모듈은 원래의 Module 패턴으로 생성 된 모듈보다 취약 할 수 있으므로 사용하는 동안주의해야합니다.