功能范围提供了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
}
但我很少看到这种模式。有没有理由不使用后者?
答案 0 :(得分:3)
简单:为什么?
"隐私"被严重高估了。它并不隐藏任何真正想要它的人。受到保护"或者"私人"成员纯粹是为了程序员的利益,特别是为了表明应该如何使用特定成员(这个这里是一个公共API,这个这里不是所以除非你知道它做了什么,否则请不要碰它。这就是全部。像启动下划线这样的命名约定足以实现它。如果会员名称以下划线开头,请不要触摸它,除非您知道自己在做什么。
没有内在的需要进一步向后弯曲。
答案 1 :(得分:3)
您已经说明了第二种模式的优点。缺点是:
您必须按可见性对方法进行分组(即使私有方法与公共方法密切相关,但与其他私有方法几乎无关),或者重复对象文字中的所有公共方法(不是; t与jsdoc配合良好。)
代码为您的班级的每个实例引入了一个单独的函数对象,这会牺牲一些性能(这通常不重要,但有时可能会这样)
与许多编程语言中的私有修饰符不同,这种封装无法被规避,即使误用,我真的知道自己在做什么(从历史上看,JavaScript一直是一个环境,任何事情都有,并且很多人将其成功归功于这种可扩展性)