2014-10-16 7 views
7

일부 자바 스크립트를 재구성하려고하는데 모듈 패턴에 대해 혼란스러워합니다. 지금이모듈 패턴 사용과 새로운 객체 인스턴스화의 차이점

한 가지 방법은 단순히 너무

var Foo = function(){ 
    this.Bar = {}; 
    ... 
} 

같은 구성 요소의 모든 기능을 포함하는 클래스를 선언하고 구성 요소에 사용하기 위해 새로운 인스턴스를 생성하는 것입니다. 그러나 모듈 패턴에 대해서도 읽었으므로 동일한 방식으로보다 복잡한 방식으로 나타나는 것처럼 내가 가진 것과 비교하여 어떤 이점을 얻을 수 있는지 알 수 없습니다. 어쩌면 나는 더 나은 선택을하는 경우를 만난 적이 없을 것이다. 예를 들어 ,이 같은 패턴 :

var module = (function() { 
    // private variables and functions 
    var foo = 'bar'; 

    // constructor 
    var module = function() { 
    }; 

    // prototype 
    module.prototype = { 
     constructor: module, 
     something: function() { 
     } 
    }; 

    // return module 
    return module; 
})(); 

var my_module = new module(); 

내가 이미 있던 무슨 유의 한 차이가 나타나지 않습니다. 이 패턴은 내가 다른 방식으로는 할 수 없다는 것을 어떻게 할 수 있습니까?

+1

이 질문에는 여러 가지 좋은 답변이 있습니다. http://stackoverflow.com/questions/5647258/how-to-use-re-re-reation-module-pattern-in-javascript – Hrishi

답변

3

첫 번째 예에서는 두 가지 주요 차이점이 있습니다. 프로토 타입을 사용하려면 개인 변수와 함수를 사용할 수 없습니다. 공용 변수 및 메서드는 생성자에서 this에 연결하여 생성 된 경우에만 전용 변수 및 함수를 가질 수 있습니다. 개인 변수와 기능

예 1 :

var Foo = function(){ 
    var privateVar = "priv"; 

    function privateFunction(){ 
     console.log(privateVar); 
    } 

    this.publicProperty = 1; 

    this.publicFunction = function(){ 
     console.log(privateVar); 
    } 
} 

위는 프로토 타입을 사용하지 않는 경우 문제가되지 않습니다. 그러나 두 번째 예제의 이점을 활용하지 않고도 개인 변수를 가질 방법이 없습니다.

위에서 볼 수 있듯이 두 번째 예제는 변수를 초기화하기 위해 생성자를 남길 수있는 반면에 생성자 내에 모든 것을 포함해야합니다.

반대로 두 번째 예제의 프로토 타입 메서드는 생성자의 범위를 벗어나므로 생성자 내에서 함수의 변수를 사용할 수 없습니다. 프로토 타입 메소드가 필요로하는 모든 함수와 변수는 외부 클로저 범위에서 선언되어야합니다.

+0

관심을 가져 주셔서 감사합니다. – MrCode

+0

설명해 주셔서 감사합니다, 왜 downvoted있어 모르겠어요 : / – Valyrion