2013-03-06 6 views
2

나는 "JavaScript Module Pattern" as described in this popular article을 따르는 많은 "모듈"을 가지고 있습니다. 내 이해하기 위해 이러한 모듈은 다양한 비트 동작을 깔끔한 네임 스페이스로 집계하는 방법입니다.자바 스크립트 모듈 패턴으로 클래스를 사용할 수 있습니까?

하지만 인수를 허용하는 고유 한 개체 인스턴스를 만들려면 어떻게해야합니까? 그대로, 나는 모든 데이터가 공유/고정되어 있으므로 그렇게 할 수 없습니다. 우리는 잠시 동안 그것을 사용하고 같은

var foo = new Some.Namespace.Whatever.Foo(config); 

나는 패턴의 구조를 변경할 수 없습니다 그리고 그것은 매우 잘 작동 : 나는이 작업을 수행 할 수 있어야합니다. 비 정적 데이터로 작업하는 "클래스"를 던질 수 있도록 비틀기를 원합니다.

+0

을 무슨 뜻인지 나는 문제가 무엇인지 이해하지 못하는 것입니다. 왜 클래스를 모듈의 멤버로 사용할 수 없습니까? – benekastah

+0

@benekastah 만약 내가한다면, 내가 사용하는 모든 데이터는 다른 인스턴스에 의해 공유됩니다. –

+0

나는 그렇게 생각하지 않는다. 내가 문제를 올바르게 이해한다면, 내가해야 할 대답을 추가했다. – benekastah

답변

4

왜이 기능을 사용하지 않으시겠습니까?

var MODULE = (function() { 
    var my = {}; 

    my.SomeClass = SomeClass; 
    function SomeClass(six) { 
    this.six = six; 
    } 
    SomeClass.prototype.five = 5; 

    return my; 
})(); 

var obj = new MODULE.SomeClass(6)으로 전화하면 새로운 개체가 제공됩니다. obj.five은 프로토 타입에 연결되어 있기 때문에 SomeClass의 모든 인스턴스간에 공유됩니다. 그러나 은 obj에 연결되어 있기 때문에 해당 인스턴스에만 해당됩니다.

또는 클래스가 모듈 안에있을 필요는 없습니다. 이 경우 모듈과 클래스 모두 일부 중복 기능이 있기 때문에 적절한 경우 모듈을 대체하기 위해 클래스를 사용할 수 있습니다.

+0

OK 제 문제는 모든 데이터 였고 동작은 네임 스페이스에 연결되어있는 것 같았습니다. 반면에 당신이 해낸 것처럼 인스턴스 데이터는 인스턴스에만 첨부됩니다. –

+0

프로토 타입은 상속을위한 것이며 복제를 줄이는데도 도움이됩니다. 각 인스턴스에는 동일한 메소드가있을 가능성이 높으므로 프로토 타입에 메소드를 놓습니다. 즉, 모든 인스턴스가 자체 복사본이있는 메서드가 아니라 메서드를 공유합니다. 이렇게하면 메모리 사용이 줄어 듭니다. – benekastah

+0

예. 이제 모듈 패턴과 클래스가 겹치는 의미가 무엇인지 이해합니다. 감사. –

3

이 아마 남용 모듈 패턴이지만, 이것은 당신이?

var Some = (function() { 
    var util = { /* ... */ }; 
    return { 
     Namespace: (function() { 
      return { 
       Whatever: (function() { 
        var Foo = function(config) { 
         this.foo = config.foo || "foo"; 
         this.bar = config.bar || "bar"; 
        }; 
        var Bar = function() {}; 
        Foo.prototype.toString = function() { 
         return this.foo + " " + this.bar; 
        }; 
        return { 
         Foo: Foo, 
         Bar: Bar 
        } 
       }()) 
      }; 
     }()) 
    }; 
}()); 

var foo = new Some.Namespace.Whatever.Foo({foo: "hello", bar: "world"}); 
foo.toString() // "hello world" 
+0

차가운 중첩. 이것은 바닐라 "모듈 패턴"보다는 "드러나는 모듈 패턴"입니까? –

+0

@BobbyB : 적어도 내면의 것 같아요. 그래도 특히 패턴 이름에 대해서는 걱정하지 않았습니다. –