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 一直是一个环境去,许多人将其成功归功于这种可扩展性)
函数作用域提供 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 一直是一个环境去,许多人将其成功归功于这种可扩展性)