我可以使用带有javascript模块模式的类吗?

时间:2013-03-06 16:13:48

标签: module-pattern javascript

我有一堆跟随"JavaScript Module Pattern" as described in this popular article的“模块”。据我所知,这些模块是一种将各种行为聚合成整洁的命名空间的方法。

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

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

我无法改变模式的结构,因为我们已经使用了一段时间并且效果非常好。我只想调整它,这样我就可以将一些“类”放入其中,使用非静态数据。

2 个答案:

答案 0 :(得分: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.six特定于该实例,因为它附加到obj

或者,您可能不需要将您的班级置于模块内。您可以使用类来替换适当的模块,因为在这种情况下,模块和类都有一些重叠的功能。

答案 1 :(得分: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"