78

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

基本上我使用的是不显眼的 javascript——HTML 文档引用了 .js 文件。

我对模块模式的理解:

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

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

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

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

我是否正确,对于提供不显眼的 javascript,模块模式是理想的?

4

3 回答 3

70

构造函数和原型是实现类和实例的合理方式之一。它们与该模型并不完全对应,因此您通常需要选择特定的方案或辅助方法来根据原型实现类。(一些关于 JS 类的背景知识。)

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

于 2010-09-24T21:16:14.893 回答
13

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

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

于 2012-12-03T17:04:42.067 回答
4

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

于 2014-07-16T18:16:59.073 回答