代码之家  ›  专栏  ›  技术社区  ›  JulianR

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

  •  5
  • JulianR  · 技术社区  · 14 年前

    作为一个C程序员,我有一个让事情变得私人的习惯,可以而且应该是私人的,当一个JS类型向我公开它的所有私人部分时,我总是会有一种奇怪的感觉(这种感觉不会被“唤醒”)。假设我有一种类型 draw 方法,内部调用 drawBackground 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;
    
    })();
    

    当然,区别在于,在第一个例子中, 绘制背景 前景广阔 方法是公共API的一部分,而它们在第二个API中被隐藏在外部。这是可取的吗?我更喜欢哪一个?我把我的C习惯应用到JavaScript上是不是错了?我应该在JavaScript中扩展和重写所有东西吗?以及 .call(this) ?

    1 回复  |  直到 14 年前
        1
  •  7
  •   mattmc3    14 年前

    在Perl开发人员中有一句著名的引语来自于著名的骆驼书:“Perl模块希望您不要呆在它的起居室,因为您没有被邀请,而不是因为它有一把猎枪。”哲学是,如果你作为一个图书馆的开发人员想要区分你的公共和私有API,那就太好了。这样做并记录下来。你的代码的调用者应该知道哪一个是哪个,但是如果他们决定和调用你认为他们不应该调用的东西,你也可以像个白痴一样自由行动。从OO的背景来看,这是异端的,但对于脚本语言来说,这就是它们的运行方式。

    这个问题的答案有点主观,但我会告诉你,当我写javascript的时候,如果我在.NET中编码的话,有一些方法或变量是私有的,我只是在它们前面加上“prv_uuu”或“p_uu”或“uu”……任何能浮在你船上的东西。这样,你就告诉你的用户,这些东西是私人的,可能会从他们下面改变。这样一来,如果他们无论如何选择调用你的私有方法,那不确定的代码就会像拇指一样伸出。