Javascript: Module Pattern vs Constructor/Prototype pattern?

I would like to know if the module pattern or Constructor/protoType pattern is more applicable to my work.

Basically I am using unobtrusive javascript -- the HTML document has a reference to the .js file.

My understanding of the module pattern:

  • call an INIT method (which is basically a public method i can create and return using the module pattern)
  • In the INIT method, assign all click events etc.

This sounds like the perfect pattern for my situation, as I don't need to create Objects and inheritance hierarchies etc.

My understanding of the Constructor/Prototype pattern:

  • for creating objects
  • for using inheritance (i.e. Subtypes of a supertype)

Am I correct, that for providing unobtrusive javascript, the module pattern is ideal?

33568 次浏览

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

模块模式通常用于命名空间,其中您将有一个实例作为存储来对相关的函数和对象进行分组。这是一个与原型有益的用例不同的用例。它们实际上并不相互竞争; 您可以非常愉快地将两者结合使用(例如,在模块中放入构造函数,然后说 new MyNamespace.MyModule.MyClass(arguments))。

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

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

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