我有一堆跟随"JavaScript Module Pattern" as described in this popular article的“模块”。据我所知,这些模块是一种将各种行为聚合成整洁的命名空间的方法。
但是如果我想创建一个接受参数的唯一对象实例呢?就目前而言,我无法做到这一点,因为所有数据都是共享/静态的。我希望能够做到这一点:
var foo = new Some.Namespace.Whatever.Foo(config);
我无法改变模式的结构,因为我们已经使用了一段时间并且效果非常好。我只想调整它,这样我就可以将一些“类”放入其中,使用非静态数据。
答案 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"