JavaScript中的隐私权

时间:2016-06-15 12:44:42

标签: javascript partial-application

功能范围提供了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
}

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

2 个答案:

答案 0 :(得分:3)

简单:为什么?

"隐私"被严重高估了。它并不隐藏任何真正想要它的人。受到保护"或者"私人"成员纯粹是为了程序员的利益,特别是为了表明应该如何使用特定成员(这个这里是一个公共API,这个这里不是所以除非你知道它做了什么,否则请不要碰它。这就是全部。像启动下划线这样的命名约定足以实现它。如果会员名称以下划线开头,请不要触摸它,除非您知道自己在做什么。

没有内在的需要进一步向后弯曲。

答案 1 :(得分:3)

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

  • 您必须按可见性对方法进行分组(即使私有方法与公共方法密切相关,但与其他私有方法几乎无关),或者重复对象文字中的所有公共方法(不是; t与jsdoc配合良好。)

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

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