函数作用域提供了JavaScript中的唯一保密性。

因此,规范的:

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

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

...是有问题的,因为它没有为注入(inject)的依赖项提供任何封装。

提供真正封装的替代方法(尽管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
}

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

最佳答案

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

  • ,您必须按可见性对方法进行分组(即使私有(private)方法与公共(public)方法密切相关,但与其他私有(private)方法几乎没有关系),或在对象常量中重复所有公共(public)方法(不适用于jsdoc) 。
  • 该代码为您的类的每个实例引入了一个单独的函数对象,这牺牲了一些性能(通常不重要,但有时可能会降低)
  • 与许多编程语言中的私有(private)修饰符不同,即使使用不当,而且我真的知道我在做什么(这种情况一直存在,并且JavaScript一直是这种可扩展性的成功环境),即使无法正确使用,也无法绕过这种封装。

  • 09-17 15:42