2013-03-06 86 views
2

我有一堆跟在"JavaScript Module Pattern" as described in this popular article之后的“模块”。就我的理解而言,这些模块是一种将各种行为聚合成整洁名称空间的方法。我可以使用JavaScript模块模式的类吗?

但是,如果我想能够创建一个接受参数的唯一对象实例呢?就目前而言,我无法做到这一点,因为所有数据都是共享/静态的。我希望能够做到这一点:

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

,因为我们一直在使用了一段时间,我不能改变模式的结构和它的作品非常好。我只是想调整它,所以我可以扔一些“类”,它与非静态数据工作。

+0

我不明白是什么问题。为什么你不能有一个班作为模块的成员? – benekastah 2013-03-06 16:19:53

+0

@benekastah如果我这样做,那么当我使用'new'时,所有传入的数据都会被其他实例共享。 – 2013-03-06 16:22:08

+0

我不这么认为。如果我正确理解问题,我添加了一个应该工作的答案。 – benekastah 2013-03-06 16:28:53

回答

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.fiveSomeClass的所有实例之间共享,因为它连接到原型。但是,obj.six特定于该实例,因为它附加到obj

或者,您可能不需要您的课程在模块中。您可以使用类来替换模​​块,因为在这种情况下,模块和类都有一些重叠的功能。

+0

好吧,我认为我的问题是所有的数据和行为都附加到名称空间,而如你所做的那样,实例数据仅附加到实例。 – 2013-03-06 16:33:07

+0

原型用于继承,也有助于减少重复。由于每个实例可能都有相同的方法,因此您将方法放在原型上。这意味着每个实例都共享方法,而不是每个实例拥有自己的副本。这减少了内存使用量。 – benekastah 2013-03-06 16:36:20

+0

是有道理的。现在我明白你的意思是模块模式和类之间的重叠。谢谢。 – 2013-03-06 16:37:17

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

很酷的嵌套。这不是“揭示模块模式”而不是“香草模块模式”吗? – 2013-03-06 16:42:10

+0

@BobbyB:我想是的,至少是最内层的那个。不过,我从不担心模式名称。 – 2013-03-06 18:09:26

相关问题