Javascript:模块模式与构造函数/原型模式?

时间:2010-09-24 20:54:36

标签: javascript design-patterns unobtrusive-javascript module-pattern

我想知道模块模式或Constructor / protoType模式是否更适用于我的工作。

基本上我使用的是不引人注目的javascript - HTML文档引用了.js文件。

我对模块模式的理解:

  • 调用INIT方法(基本上是我可以使用模块模式创建和返回的公共方法)
  • 在INIT方法中,指定所有点击事件等。

这听起来像是我情况的完美模式,因为我不需要创建对象和继承层次结构等。

我对构造函数/原型模式的理解:

  • 用于创建对象
  • 用于继承(即超类型的子类型)

我是否正确,为了提供不引人注目的javascript,模块模式是理想的?

4 个答案:

答案 0 :(得分:68)

构造函数 - 函数和原型是实现类和实例的合理方法之一。它们与该模型并不完全对应,因此您通常需要选择特定的方案或辅助方法来实现原型方面的类。 (Some background on classes in JS。)

模块模式通常用于命名空间,您可以在其中使用单个实例作为存储来对相关的函数和对象进行分组。这与原型设计有利的用例不同。他们并没有真正相互竞争;你可以非常高兴地将两者结合使用(例如,在模块中放置构造函数并说出new MyNamespace.MyModule.MyClass(arguments))。

答案 1 :(得分:12)

模块模式比原型更容易,更优雅。但是,首先考虑移动。它不是中/大对象的相关模式,因为初始化需要在开始之前解析整个块。多个闭包还会创建垃圾收集器不会释放的循环依赖(尤其是IE),它会导致更大的内存占用空间,直到窗口(或选项卡)关闭时才会释放 - 检查chrome任务管理器以进行比较 - 使用模块模式,加载时间与对象大小成反比,而原型继承不是这种情况。 上述陈述通过多个基准验证,例如:http://jsperf.com/prototypal-performance/54

如上次测试所示。最好将小对象初始化为普通对象(没有这些模式)。它适用于不需要封闭或继承的单个对象。评估您是否需要这些模式是明智的。

答案 2 :(得分:5)

您可以尝试折叠模式,这是一个链接: Javascript Folding Pattern

我还给出了一个类似问题的答案,该问题展示了如何使用折叠模式:

Simple Example of Folding Pattern

答案 3 :(得分:4)

原型模式帮助我们扩展功能,并且内存中只有一个函数实例,而不管对象的数量。在Module模式中,每个对象在内存中创建一个新的函数实例,但它提供了私有/公共变量的概念,并有助于封装变量和函数。