Javascript:模块模式vs构造函数/原型模式?
我想知道模块模式或Constructor/protoType模式是否更适用于我的工作。Javascript:模块模式vs构造函数/原型模式?
基本上我使用不显眼的javascript - HTML文档有一个对.js文件的引用。
我模块模式的理解:
- 调用的init方法(这基本上是一个公共方法我可以创建并返回使用模块模式)
- 在init方法中,将所有的点击事件等
这听起来像我的情况的最佳模式,因为我并不需要创建对象和继承层次等
我的构造/原型模式的理解:
- 用于使用继承创建对象
- (即超类型的子类型)
我是否正确,为了提供不引人注意的javascript,模块模式是理想的?
构造函数和原型是实现类和实例的合理方法之一。它们不完全对应于该模型,因此您通常需要选择特定的方案或辅助方法来按原型实现类。 (Some background on classes in JS)
模块模式通常用于命名空间,在这里您将有一个实例作为存储来分组相关的函数和对象。这与原型设计的好处不同。他们并不真正相互竞争;你可以很高兴地一起使用它们(例如,在模块中放置一个构造函数,并说new MyNamespace.MyModule.MyClass(arguments)
)。
模块模式比原型更容易和更优雅。但是,首先想到移动。它不是中等/大型对象的相关模式,因为初始化需要在启动之前解析整个块。多个闭包还会创建垃圾收集器没有释放的循环依赖(特别是IE),直到窗口(或标签)关闭才会释放更大的内存占用 - 检查chrome任务管理器进行比较 - 加载时间为与使用模块模式的对象大小成反比,而原型继承不是这种情况。 上面的陈述通过多个基准来验证,例如:http://jsperf.com/prototypal-performance/54
如上一次测试中所见。小对象最好被初始化为普通对象(没有这些模式)。它适用于不需要关闭或继承的单个对象。评估你是否需要这些模式是明智的。
你可以尝试折叠模式,这里有一个链接: Javascript Folding Pattern
我也留下了一个答案类似的问题,这说明了如何使用折叠模式:
非常有趣的阅读;谢谢 - 我从来没有听说过这种模式。 – 2015-03-09 21:43:53
原型模式可以帮助我们扩展功能,并且不管对象数量如何,内存中只有一个函数实例。在Module patter中,每个对象在内存中创建一个新的函数实例,但它提供了私有/公共变量的概念,并有助于封装变量和函数。
道格拉斯crockfords特权级方法,允许使用私人成员呢? – wayofthefuture 2015-08-25 20:50:51
所以在我的情况下,我并不真正想创建实例,所以模块模式可能是我想要的理想选择。当你说namespacing ..我如何命名空间模块模式?我看到了使用YUI的一种方式 - 但它真的有必要吗? – Martin 2010-09-24 21:23:39
没有特别的窍门,你只需要使用一个JavaScript Object作为查找。或者像'var MyModule = {someProperty:3,someFunction:function(){...},somethingElse:null};或者分配给'MyModule.someFunction = function(){...}; '。如果你想要私有变量,你可以在立即调用的函数表达式中做这件事,并在闭包中返回一个对象......我个人发现“真正的”私有变量完全浪费时间。 – bobince 2010-09-24 21:44:58
伟大的建议全方位 – danjah 2010-11-22 02:11:20