2014-05-01 2 views
3

현재 대규모 자바 스크립트 앱 (단일 페이지)을 개발 중입니다. 웹에서 모범 사례를 찾아 보았습니다. 대부분의 프로젝트는 모듈 패턴을 사용하므로 객체가 전역 이름 공간을 오염시키지 않습니다. 이 순간 나는 정상적인 물체를 사용합니다 :Javascript 'normal'objects 대 모듈 패턴

function LoginModel(){ 
    this.model = new MyModel(); 

    this.getModel = function(){ 
     return this.model; 
    }; 
} 

이것은 읽기 쉽고 유지하기 쉽습니다 (저의 의견). 그냥 네임 스페이스 때문에 모듈 패턴을 사용하는 것이 더 나은가요 아니면 (카운터 메모리 누출, ...) 인식하지 못하는 다른 장점이 있습니까? 게다가, 나는 훌륭한 MVC 패턴을 가지며 필요한 경우 (카운터 메모리 누출) 모든 객체를 파괴하기 위해 파일을 분할했다. 따라서 중요한 질문은 : 제 경우에는 모듈 패턴을 사용할지 말아야합니까?

모듈 패턴 :

var LoginModel = (function(){ 
    var model = MyModel; 

    function getModel(){ 
     return model; 
    }; 

    return { 
     getModel: getModel 
    }; 
}); 
+1

[모듈 패턴은 무엇입니까?] (http://stackoverflow.com/questions/7471349/why-module-pattern) – thefourtheye

답변

2

페이지 당 하나의 인스턴스 만 사용하려는 경우 new 키워드를 사용할 필요가 없습니다. 개인적으로 나는 마지막 예제에서했던 것처럼 공개 모듈을 만들고 "public"속성을 가진 객체를 노출합니다.

getModel() 기능에 대한 귀하의 요지는 보이지 않지만 MyModel은 분명히 범위 외부에서 액세스 할 수 있기 때문에.

나는 약간을 다시 것

:

당신이 model, 당신은 느슨한 augumentation을 사용할 수 있습니다 얻고 변경됩니다 그 어떤 모듈의 불확실한 경우
var LoginModel = (function(model, window, undefined){ 

    function init(){ } // or whatever 

    function doSomethingWithModel(){ 
     console.log(model); 
    } 

    return { init: init }; 

})(MyModel, window); 

})(MyModel, window); 

})(MyModel || {}, window); 

모듈의 여러 인스턴스가 필요할 경우, 같은 :

var LoginModel = (function(model, window, undefined){ 

    function loginModel(name){ // constructor 
     this.name = name; // something instance specific 
    } 

    loginModel.prototype.getName = function(){ 
     return this.name; 
    }; 

    return loginModel; 

})(MyModel, window); 

var lm1 = new LoginModel('foo'); 
var lm2 = new LoginModel('bar'); 

console.log(lm1.getName(), lm2.getName()); // 'foo', 'bar' 
+0

두 답을 모두 수락 할 수는 없지만 훌륭합니다. 나는 당신이 언급 한 포인트를 얻었고'revealing module pattern '을 사용하도록 코드를 바꾸었다! 도움을 주셔서 감사합니다 :) – GuyT

+0

@GuyT 내 기쁨! – Johan

3

모듈 패턴은 전체 코드 조직에 더 좋다. 이 기능을 사용하면 해당 범위에서 사적인 데이터, 논리 및 기능을 사용할 수 있습니다.

두 번째 예에서 getModel() 외부에서 모델을 가져 오는 방법입니다. 모듈에 선언 된 변수는 명시 적으로 노출되지 않는 한 숨겨집니다. 이것은 매우 편리 할 수 ​​있습니다.

조금 더 복잡한 것 외에 다른 단점은 없습니다. 조직 및 캡슐화를위한 옵션이 추가됩니다.

내 모델이 더 많은 구조와 일부 개인 범위를 필요로 할 정도로 복잡해질 때까지 일반 개체를 사용합니다. 그리고 그 점을 명심하면, 그것을 사용하는 코드를 깨지 않으면 서 그것을 공개 모듈로 재정의하는 것이 쉽습니다.

+0

+1 모듈 접근 방식에 대한 일반 객체 - 좋은 제안입니다. – Johan

1

가 귀하의 질문에 당신은 "일반 객체", 함수가 생성자 함수가된다 부르는와

년으로 융합 몇 가지 개념의 새로운 키워드가 필요합니다.

두 번째 예는 IIFE 내부에있는 모듈 모듈 표시 모듈을 사용합니다. 이것은 가장 많이 사용되는 모듈 패턴의 변형이지만 불행히도 심하게 결함이 있습니다.차이점에 대한 설명은 내 답변 here을 참조하고 그 결함은 here을 참조하십시오.

자, 질문은 잘못된 이분법을 나타냅니다 - 일반적인 객체 또는 모듈 패턴? 선택을 할 필요는 없습니다. 보통 객체는 closure 범위 안에 private를 유지하기 만하면되는 단순한 모듈 패턴을 사용할 수 있습니다. 예 :

function LoginModel(){ 
    var _notifyListeners = function(){ 
     // Do your stuff here 
    }; 

    this.model = new MyModel(); 

    this.getModel = function(){ 
     _notifyListeners(); 
     return this.model; 
    }; 
} 

이것은 모듈 패턴을 사용하는 "일반 개체"의 예입니다. 당신이해야하는 일은, 모듈 패턴을 드러내는 것입니다. 모두을 클로저 범위에 넣는 것입니다. 개인적으로 유지하고자하는 것들을 클로저 범위 내에 두어야합니다.