JavaScript:我应该隐藏我的实现吗?

5
作为一名C#程序员,我有一个习惯,即将可以和应该私有化的东西私有化。当一个JS类型向我展示它的所有私有部分时(这种感觉并不是“被激起的”),我总是感到奇怪。假设我有一个类型,它有一个draw方法,内部调用drawBackgrounddrawForeground,这些方法单独调用没有意义。那么我该如何实现呢? 选项1:
Foo = function(){
  this.draw();  
};

Foo.prototype.draw = function(){
  this.drawBackground();
  this.drawForeground();
};

Foo.prototype.drawBackground = function(){};
Foo.prototype.drawForeground = function(){};

选项二

Foo = (function(){

  var constructor = function(){
    this.draw();
  };

  var drawBackground = function(){};
  var drawForeground = function(){};

  constructor.prototype.draw = function(){
    drawBackground.call(this);
    drawForeground.call(this);
  };

  return constructor;

})();

当然,第一个例子中,drawBackgrounddrawForeground 方法是公共API的一部分,而在第二个例子中它们对外部隐藏。这是可取的吗?我应该选择哪一个?我是否错误地将我的C#习惯应用于Javascript,并且应该在Javascript中使所有内容都可扩展和覆盖?.call(this) 的性能影响是什么?


我可能误解了你的问题,但在选项1中,drawBackground/drawForeground是公共的(即使你希望它们是私有的),所以只有选项2才能实现你想要的。 - Marco Demaio
嗯,是的,这就是我的问题,当我有机会时,我应该更喜欢将事情保密吗? - JulianR
1个回答

7
Perl开发人员中有一句广为流传的名言,来自于(臭名昭著的)Camel书籍:“一个Perl模块更希望你不要进入它的客厅,因为你没有被邀请,而不是因为它有散弹枪。” 这种哲学观认为,如果您作为库的开发者想要区分公共API和私有API,那很好。做到并进行文档记录。调用您代码的人应该知道哪个是哪个,并且在决定调用您不认为他们应该调用的内容时也可以像白痴一样自由行事。从面向对象的背景来看,这是异端邪说,但对于脚本语言,这就是它们的运作方式。
对此的回答有点主观,但我会告诉你,当我编写JavaScript并拥有方法或变量,如果我在.NET中编码,则可能是私有的,我只需将它们前缀添加“prv_”或“p_”或仅“_”…随便怎么做都可以。这样,您已经告诉用户这些内容是私有的,并且可能会在他们的控制之外发生变化。如果他们仍然选择调用您的私有方法,那么这种可疑的代码就会像明显的指标一样显眼。

1
是的,在像ExtJS这样的框架中,我经常看到这种情况,即使某些东西被标记为“// private”,但它们仍然可以完全访问。 - JulianR
在库中,前缀 _ 似乎是最常用的实践方法。有些人也会使用注释或 @private JSdoc 注释。 - Jani Hartikainen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接