面向对象的JavaScript中的私有函数

wil*_*lma 2 javascript oop

当我尝试使用私有方法进行面向对象的纯JS时,我经常执行以下操作

(function(exports) {

  var Foo = function(num) {
    this.num = num
  };

  var addTwo = function() {
    this.num += 2;
  };

  Foo.prototype.addFour = function() {
   addTwo.call(this);
   addTwo.call(this);
  };

  exports.Foo = Foo;

})(this);
Run Code Online (Sandbox Code Playgroud)

然后我就能做到

var foo = new Foo(0);
foo.addFour();
console.log(foo.num); // => 4
Run Code Online (Sandbox Code Playgroud)

它感觉很干净,它允许我创建真正的私有函数,而不是使用_前缀来表示方法应该被视为私有(但实际上不是).

这让我知道我需要哪些功能进行单元测试,哪些不需要.它还可以防止我被诱惑使用应该是私有的功能.但我没有在其他地方看到这种模式.

那么为什么其他人不使用这种模式呢?他们又做了什么呢?

Cod*_*ike 6

很多人这样做.它在某种程度上被正式称为揭示模块模式.


好处

  • 为开发人员提供更清洁的方法
  • 支持私人数据
  • 全局命名空间中的混乱程度较低
  • 通过闭包实现函数和变量的本地化
  • 我们脚本的语法更加一致
  • 明确定义的公共方法和变量,可提高可读性

缺点

  • 私人方法无法进入.
  • 有人说这会导致单元测试无法进行,但通常情况下,如果你质疑一个函数的完整性,它应该以这样的方式设计,公开地公开该函数的效用,从而使它成为可能.测试.鉴于jQuery对模块模式的适应性以及他们日常使用QUnit来自动化测试,这个要点并不是真正相关,但仍然列出用于文档目的.
  • 私有方法和函数由于无法访问而失去可扩展性(请参阅上一个要点中的评论).
  • 修补私有内容引用的公共方法和变量更加困难.