2010-07-10 49 views
5

作为一个C#程序员,我有一点使事情私募认为可以而且应该成为私人的习惯,我总是得到一个奇怪的感觉,当一个JS类型公开其所有的私处,我(那感觉是不是“引起“)。说我有具有draw方法,它在内部调用drawBackgrounddrawForeground,这没有任何意义,以对自己称为一个类型。我应该如何实现这一点?Javascript:我应该隐藏我的实现吗?

选项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; 

})(); 

的差,当然,作为在第一实施例中,drawBackgrounddrawForeground方法是公共API的一部分,而第二个则隐藏在外面。这是可取的吗?我应该选择哪一个?我错误的是将我的C#习惯应用于Javascript,并且我应该让所有的东西都可扩展并且可以在Javascript中重载吗? .call(this)的性能影响是什么?

+0

我大概misundertood你的问题,但在方案1中drawBackground/drawForeground是公共的(即使你希望他们是私有的),所以达到你想要只选择2名的作品是什么。 – 2010-07-10 22:05:47

+0

嗯,是的,那是我的问题,我应该在什么时候让事情私下化? – JulianR 2010-07-10 22:13:09

回答

7

在Perl开发人员中有一个众所周知的引用来自着名的骆驼书:“一个Perl模块宁愿留在客厅,因为你没有被邀请,不是因为它有一个猎枪“。哲学是,如果你作为一个图书馆的开发者想要区分你的公共和私人API,那很好。做到这一点,并记录下来。你的代码的调用者应该知道哪个是哪个,而且是免费的,如果他们决定,并呼吁东西,你不认为他们应该打电话像一个白痴。从面向对象的背景下,这是异端的,但与脚本语言,这是他们如何滚动。

这个问题的答案是有点主观的,但我会告诉你,当我在写JavaScript和有方法或变量,如果我在.NET中的编码,这将是私人的,我只是像他们的前缀“prv_”或“p_”或者只是“_”......不管漂浮在你的船上。这样,你告诉你的用户这些东西是私人的,可以从它们下面改变。这样一来,如果他们选择调用你的私有方法,那么这个不安的代码就会像拇指一样伸出手来。

+1

是的,我看到了很多像ExtJS的,那里的东西已经被标记为'框架// private'即使他们是完美的访问。 – JulianR 2010-07-10 22:14:31

+0

用_作为前缀似乎是图书馆中最常用的做法。有些还使用注释或@private JSdoc注释。 – 2010-07-10 22:32:43

相关问题