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

Javascript: Module Pattern vs Constructor/Prototype pattern?

提问人:Martin 提问时间:9/25/2010 最后编辑:ataddeiniMartin 更新时间:7/17/2014 访问量:33877

问:

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

基本上我使用的是不显眼的javascript - HTML文档具有对.js文件的引用。

我对模块模式的理解:

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

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

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

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

我说得对吗,为了提供不显眼的 javascript,模块模式是理想的?

设计 unobtrusive-javascript 模块模式

评论


答:

70赞 bobince 9/25/2010 #1

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

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

评论

1赞 Martin 9/25/2010
因此,就我而言,我并不是真的想创建实例,因此模块模式可能非常适合我想要的东西。当你说命名空间时......如何在模块模式中设置命名空间?我看到了使用 YUI 的一种方式 - 但它真的有必要吗?
16赞 bobince 9/25/2010
没有什么特别的技巧,你只是使用JavaScript作为查找。直接创建对象文本 like 或赋值给 。如果你想要私有变量,你可以在一个立即调用的函数表达式中去做,并在闭包中有一个对象......就我个人而言,我发现“真正的”私有变量完全是浪费时间。Objectvar MyModule= { someProperty: 3, someFunction: function() { ... }, somethingElse: null };MyModule.someFunction= function() { ... };return
1赞 Jordan 8/14/2015
js 有类的想法可能非常具有误导性 - 这是一本关于你不知道 JS |尽管 ES6 支持“类”,但这些大多只是原型功能的掩饰,并且将它们视为类,就像您认为 Java 或 C# 中的类一样,这将导致您走上混乱的道路。使用原型时,我建议使用上述链接书籍第 6 章中描述的 OOLO 模式。
1赞 Jordan 8/14/2015
我还认为 js 中的继承想法有点用词不当,委托是一个更好的术语:chipersoft.com/p/inheritance 。我同意模块模式对于保持复杂的应用程序整齐地分开很有用,但是有很多很好的案例可以使用模块模式进行组合/增强,特别是如果你与不太熟悉 js 的开发人员一起工作 - 他们可能更容易理解 IIFE 是什么,而不是(真正)理解原型: adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html
5赞 PDN 4/14/2016
@bobince我知道你很久以前就发布了这个,但为什么你觉得真正的私有变量是浪费时间?
13赞 Yann VR 12/4/2012 #2

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

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

4赞 user1662008 7/17/2014 #3

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

评论

0赞 wayofthefuture 8/26/2015
道格拉斯·克罗克福德(Douglas Crockfords)允许使用私人成员的特权类方法呢?