2

我有一堆“模块”,它们遵循这篇热门文章中描述的“JavaScript 模块模式”。据我了解,这些模块是将各种行为聚合到整洁的命名空间中的一种方式。

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

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

我无法更改模式的结构,因为我们已经使用了一段时间,而且效果很好。我只想对其进行调整,以便可以将一些“类”放入其中,以处理非静态数据。

4

2 回答 2

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.

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

于 2013-03-06T16:27:05.730 回答
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"
于 2013-03-06T16:35:19.977 回答