提问人:Martin 提问时间:9/25/2010 最后编辑:ataddeiniMartin 更新时间:7/17/2014 访问量:33877
Javascript:模块模式与构造函数/原型模式?
Javascript: Module Pattern vs Constructor/Prototype pattern?
问:
我想知道模块模式或构造函数/protoType 模式是否更适用于我的工作。
基本上我使用的是不显眼的javascript - HTML文档具有对.js文件的引用。
我对模块模式的理解:
- 调用 INIT 方法(这基本上是一个公共方法,我可以使用模块模式创建和返回)
- 在 INIT 方法中,分配所有点击事件等。
这听起来像是我的情况的完美模式,因为我不需要创建对象和继承层次结构等。
我对构造函数/原型模式的理解:
- 用于创建对象
- 用于使用继承(即超类型的子类型)
我说得对吗,为了提供不显眼的 javascript,模块模式是理想的?
答:
构造函数和原型是实现类和实例的合理方法之一。它们与该模型并不完全对应,因此通常需要选择特定的方案或帮助程序方法来根据原型实现类。(JS类的一些背景知识。
模块模式通常用于命名空间,其中将有一个实例充当存储,以对相关函数和对象进行分组。这是一个与原型设计不同的用例。他们并没有真正相互竞争;您可以非常愉快地将两者一起使用(例如,将构造函数放在模块中并说)。new MyNamespace.MyModule.MyClass(arguments)
评论
Object
var MyModule= { someProperty: 3, someFunction: function() { ... }, somethingElse: null };
MyModule.someFunction= function() { ... };
return
模块模式比原型更容易、更优雅。但是,首先考虑移动。它不是中型/大型对象的相关模式,因为初始化需要在开始之前解析整个块。多个闭包还创建了垃圾回收器不会释放的循环依赖关系(尤其是 IE),它会导致在窗口(或选项卡)关闭之前不会释放更重的内存占用 - 检查 chrome 任务管理器进行比较- 加载时间与使用模块模式的对象大小成反比,而原型继承则不然。 上述陈述通过多个基准测试进行验证,例如: http://jsperf.com/prototypal-performance/54
如上次测试所示。小对象最好初始化为普通对象(没有这些模式)。它适用于不需要闭包或继承的单个对象。明智的做法是评估您是否需要这些模式。
原型模式帮助我们扩展功能,无论对象数量如何,内存中只有一个函数实例。在模块模式中,每个对象在内存中创建一个新的函数实例,但它提供了私有/公共变量的概念,并有助于封装变量和函数。
评论