5

作为一名 C# 程序员,我有点习惯将可以而且应该是私有的东西设为私有,当 JS 类型将其所有私有部分暴露给我时,我总是有一种奇怪的感觉(而且这种感觉并没有被“激发” )。假设我有一个类型,它有一个draw方法,它在内部调用drawBackgroundand drawForeground,单独调用是没有意义的。我应该如何实现这个?

选项1

Foo = function(){
  this.draw();  
};

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

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

选项 2

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;

})();

当然,不同之处在于,在第一个示例中,drawBackgroundanddrawForeground方法是公共 API 的一部分,而在第二个示例中它们是隐藏在外部的。这是可取的吗?我应该更喜欢哪一个?将我的 C# 习惯应用到 Javascript 是否是错误的,我是否应该在 Javascript 中使所有内容都可扩展和覆盖?的性能影响是.call(this)什么?

4

1 回答 1

7

Perl 开发人员中有一句名言出自著名的 Camel 书:“Perl 模块宁愿你呆在客厅之外,因为你没有被邀请,而不是因为它有猎枪。”。哲学是,如果您作为库的开发人员想要区分您的公共和私有 API,那很好。这样做并记录下来。你的代码的调用者应该知道哪个是哪个,但如果他们决定调用你认为他们不应该调用的东西,他们也可以自由地表现得像个白痴。从面向对象的背景来看,这是异端,但对于脚本语言,这就是它们的滚动方式。

这个问题的答案有点主观,但我会告诉你,当我编写 JavaScript 并且如果我在 .NET 中编码时拥有私有的方法或变量,我只需在它们前面加上“prv_”或“p_”或只是“_”......无论你的船漂浮。这样,您就告诉您的用户这些东西是私有的,并且可以从他们下面改变。这样一来,如果他们仍然选择调用您的私有方法,那么不确定的代码就会像大拇指一样突出。

于 2010-07-10T22:06:41.240 回答