Javascript 揭示模块模式

Javascript revealing module pattern

我很难理解揭示模块模式的优点。 取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 看起来更干净,您可以更轻松地看到您的私有变量和 public 变量。

嗯,

  • duke 一个Person
  • dust 不是 OtherPerson

在JavaScript中:

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

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

模块模式为您提供了隐藏私有变量和方法的优势。 Revealing Module Pattern 变体实现使您能够轻松修改代码以从 private 切换到 public ,反之亦然,但在 significant cost. See this answer 用于 Module Pattern 实现的差异,但它的要点是 Revealing Module Pattern 在覆盖和原型继承方面表现不佳。

您的 OtherPerson 是揭示模块模式的一个例子。你的 Person 是经典的 JavaScript,但是,根据你如何实现一个更复杂的例子,它可以像模块模式的原始实现一样使用,用于常规覆盖和原型覆盖。模块模式与您的示例的不同之处在于,模块模式避免使用许多人讨厌的 new 关键字,并且模块模式组织使得更容易看出哪些方法是 public 与哪些方法是 public 。这是私人的。