1

考虑以下 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
      };
    })();
4

2 回答 2

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 引用传递给从内部实例化的任何需要引用其父对象的对象
  • 我喜欢我可以在没有 _self.whatever 或 this.whatever 的情况下引用所有内部函数,而忽略它们是私有的还是公共的
于 2012-04-10T14:31:23.503 回答
1

这些定义没有达到完全相同的效果。

  • var localFunc1function localFunc2做同样的事情,它们创建仅在您的外部函数内部可用的函数。

  • this.localFunc3并且localFunc4不是真正的本地函数:它们都属于window对象(this在该上下文中 is window,并且localFunc4在没有语句的情况下var声明)。

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

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

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

于 2012-04-10T14:37:32.083 回答