2015-12-02 108 views
2

我很难理解揭示模块模式的优点。 采取f.e.下面的代码:Javascript揭示模块模式

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有什么区别呢?

我个人认为人看起来很干净,你可以更容易地看到你的私人和公共变量。

回答

3

好,

  • duke一个Person
  • dust不是一个OtherPerson

在JavaScript:

instanceof duke === Person // true 
instanceof dust !== AnotherPerson // true 

Person模式可能用于构建将被实例化的对象,也可以是模块。另一方面,构造函数只返回一个简单的JavaScript对象,因此稍后将其实例化是没有意义的。但是,不是对象构造函数的模块可以使用此模式(例如,使用其他本地定义的数据的函数)。

0

模块模式为您提供了隐藏您的私有变量和方法的优势。 “揭示模块模式”变体实现使您能够轻松修改代码以从私有模式切换到公共模式,反之亦然,但是在significant cost处。有关模块模式实现方面的差异,请参阅this answer,但其要点是“展现模块模式”在重写和原型继承方面表现不佳。

OtherPerson是所述显示模块模式的一个例子。然而,您的Person是经典的JavaScript,但取决于您如何实现更复杂的示例,它可以像常规覆盖和原型覆盖一样使用模块模式的原始实现。模块模式与您的示例不同之处在于,模块模式避免使用许多人所厌恶的new关键字,并且模块模式组织可以更轻松地查看哪些方法是公开的,哪些是私有的。