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

Mar*_*tin 73 javascript design-patterns unobtrusive-javascript module-pattern

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

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

我对模块模式的理解:

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

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

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

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

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

bob*_*nce 68

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

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

  • 没有特别的技巧,你只需使用JavaScript`Object`作为查找.直接创建一个对象文字,如`var MyModule = {someProperty:3,someFunction:function(){...},somethingElse:null};`或赋值给`MyModule.someFunction = function(){...}; `.如果你想要私有变量,你可以在一个立即调用的函数表达式中执行它,并在闭包中使用`return`一个对象...我个人发现'真正的'私有变量完全浪费时间. (16认同)
  • @bobince我知道你在很久以前发布了这个,但为什么你发现真正的私有变量浪费时间? (5认同)

Yan*_* VR 12

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

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