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

时间:2016-05-17 18:31:33

标签: 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);

然后我可以做

var foo = new Foo(0);
foo.addFour();
console.log(foo.num); // => 4

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

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

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

2 个答案:

答案 0 :(得分:6)

很多人这样做。它在某种程度上被正式称为Revealing Module Pattern

<强>优点

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

<强>缺点

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

答案 1 :(得分:0)

JavaScript中没有访问修饰符(private,protected,public), 但你可以创建你的对象 一些变量和方法不会从外部访问。

var ExampleObject = function() {
  var privateVariable = "I am Private Variable" // this variable can be accessed only in ExampleObject instance;

  this.publicVariable = "I am Public Variable" // this way you can access variable from outside;

  // NOW FOR METHODS

  // this method only could be accessed inside instance of ExampleObject
  var privateFunction = function() {
    return "I am Private Function";
  }

  // this method could be accessed outside and inside instance of ExampleObject
  // also notice that this method can return private variables or functions of instance to outside of instance
  this.publicFunction = function() {
    alert(privateFunction())
    return privateVariable;
  }
}

var instanceExample = new ExampleObject();
<!-- alert(instanceExample.privateFunction()) // will throw Uncaught TypeError: instanceExample.privateFunction is not a function -->

alert(instanceExample.publicFunction())