JavaScript 中的隐私

Privacy in JavaScript

函数作用域提供 JavaScript 中唯一的隐私。

所以规范:

function Ctor(dep1, dep2) {
  this._dep1 = dep1;
  this._dep2 = dep2;
}

Ctor.prototype.foo = function() {
  // use this._dep1/2...
}

...有问题,因为它没有为注入的依赖项提供封装。

提供真正封装的替代方案(尽管 foo 的位置略有不同)可能是:

function factory(dep1, dep2) {
  return {
    foo: partial(foo, dep1, dep2), // or use bind (partial could be a library fn for partial application)
  };
}

function foo(dep1, dep2) {
  // use dep1/2
}

但我很少看到这种模式。有充分的理由不使用后者吗?

简单:为什么?

"Privacy" 被高估了。它不会向任何真正想要它的人隐藏任何东西。拥有 "protected" 或 "private" 成员纯粹是为了程序员的利益,特别是为了表明应该如何使用特定成员(this 这里是 public API, this 这里不是所以请不要触摸它,除非你知道它的作用)。就这样。像开始下划线这样的命名约定就足以实现它。如果成员名称以下划线开头,请不要触摸它,除非您知道自己在做什么。

没有比这更进一步向后弯腰的内在需要。

您已经说明了第二种模式的优点。缺点是:

  • 您必须根据可见性对方法进行分组(即使私有方法与 public 方法密切相关,但与其他私有方法几乎没有关系),或者重复所有 public 对象字面量中的方法(不适用于 jsdoc)。

  • 代码为您的 class 的每个实例引入了一个单独的函数对象,这会牺牲一些性能(这通常无关紧要,但有时可能)

  • 与许多编程语言中的私有修饰符不同,这种封装是无法绕过的,即使被误用而且我真的知道我在做什么(从历史上看,JavaScript 一直是一个环境去,许多人将其成功归功于这种可扩展性)