我很难理解揭示模块模式的优点。 拿f.e.以下代码:
var Person = function(name){
this.name = name;
var priv = 'secret';
}
var OtherPerson = function(name){
var name = name;
var priv = 'secret';
return({name: name});
}
duke = new Person('john');
dust = new OtherPerson('doe');
据我所知,OtherPerson应该是一个经典的揭示模块,因为我在网络的各种资源中找到它。那么Person和OtherPerson有什么区别?
我个人认为Person看起来更干净,你可以更容易地看到你的私人和公共变量。
答案 0 :(得分:3)
那么,
duke
a Person
dust
不是 OtherPerson
在JavaScript中:
instanceof duke === Person // true
instanceof dust !== AnotherPerson // true
Person
模式可能对构建将要实例化的对象很有用,并且也可以是模块。另一方面,OtherPerson
构造函数只返回一个简单的JavaScript对象,因此以后实例化它是没有意义的。但是,不是对象构造函数的模块可以使用此模式(例如,使用其他本地定义的数据的函数)。
答案 1 :(得分:0)
模块模式为您提供了隐藏私有变量和方法的优势。 Revealing Module Pattern变体实现使您能够轻松修改代码以从私有切换到公共,反之亦然,但是significant cost。有关模块模式实现的差异,请参阅this answer,但其要点是Revealing Module Pattern在覆盖和原型继承方面表现不佳。
你的OtherPerson
是揭示模块模式的一个例子。您的Person
是经典的JavaScript,但是,根据您实现更复杂的示例的方式,它可以像常规覆盖和原型覆盖一样使用模块模式的原始实现。模块模式与您的示例的不同之处在于模块模式避免使用许多人厌恶的new
关键字,并且模块模式组织可以更容易地查看哪些方法是公开的哪些方法是私有的。