在javascript模块中推荐使用私有成员的方法

时间:2012-04-10 14:24:50

标签: javascript design-patterns

考虑以下JavaScript代码。功能定义似乎都达到了同样的效果。是否有任何推荐的约定来定义在返回字典对象中“显示”的函数?

var testModule = (function(){
      var counter = 0;

      var localFunc1 = function() {
        return "local 1";
      }

      function localFunc2() {
        return "local 2";
      }

      this.localFunc3 = function() {
        return "local 3";
      }

      localFunc4 = function() {
        return "local 4";
      }

      return {      
        proxy1: localFunc1,
        proxy2: localFunc2,
        proxy3: localFunc3,
        proxy4: localFunc4
      };
    })();

2 个答案:

答案 0 :(得分:2)

我认为没有任何真正的首选方法。我见过的最常见的设置包括将所有方法创建为本地(使用var),然后返回一个公开公共方法的对象。

有几点需要注意:

  • this.localFunc3仅在您的对象使用' new'进行实例化时才有效。关键字
  • 返回对象时,从每个函数中删除(),以便返回对函数的引用而不是函数的返回值
  • localFunc4将是全球性的,因为它没有' var'在它前面的关键字

使用这样的模块模式时,我倾向于采用以下方式:

var Obj = ( function () {
    var private_static = 'this value is static';
    return function () {
        //-- create return object
        var _self = {};
        //-- create private variables
        var private_variable = 'this value is private';
        var func1 = function () {
            return 'value 1';
        };
        //-- attach public methods
        _self.func1 = func1;
        //-- return the object
        return _self;
    };
} )();

关于这种方法的一些注意事项:

  • 允许私有静态变量(如果你不需要私有静态变量,你可以删除闭包)
  • 首先创建_self引用,您可以将自引用传递给从内部实例化的任何需要引用其父级的对象
  • 我喜欢我可以在没有_self.whatever或this.whatever的情况下引用所有内部函数,忽略它们是私有的还是公共的

答案 1 :(得分:1)

这些定义并没有完全相同。

  • var localFunc1function localFunc2执行相同的操作,它们只创建外部函数中可用的函数。

  • this.localFunc3localFunc4不是真正的本地函数:它们都属于window对象({1}},在该上下文中为this,声明window而没有localFunc4声明。

因此,后两者甚至不需要在返回的对象上公开,因为它们已经是全局的。而且,实际上,您不会在返回对象上公开任何函数,因为您调用它们中的每一个都会显示它们的返回值。你试图这样做吗?

var

注意:我建议您观看this video Douglas Crockford解释在JavaScript中处理继承的多种方法。我相信你正在寻找他所谓的“寄生遗传”。