模块

http://christianheilmann.com/2007/08/22/again-with-the-module-pattern-reveal-something-to-the-world/
模块模式
不久前,我还对JavaScript中的模块模式的美妙之处以及在调用或读取其他公共方法和属性的公共方法和特性时重复长名称空间时我对它感到的烦恼大加赞赏。

概括一下,“经典”模块模式意味着您将变量定义为一个匿名函数,然后立即用()调用该函数。定义私有函数和变量,并将公共变量和函数作为匿名对象的属性和方法返回:

var classicModulePattern = function(){
  var privateVar = 1;
  function privateFunction(){
    alert('private');
  }
  return {
    publicVar:2,
    publicFunction:function(){
      classicModulePattern.anotherPublicFunction();   
    },
    anotherPublicFunction:function(){
      privateFunction();
    }
  }
}();
classicModulePattern.publicFunction();

我的缺点是,当您想从另一个公共方法调用一个或访问公共变量时,需要重复主对象的名称。另一点我很恼火的是,对于你想公开的东西,不得不转换成对象文字符号。

受YUI上关于模块模式和pubstandards的博客帖子的启发,我开始提倡使用名为pub的命名对象在返回方法和属性之前向其附加方法和属性。这样,您可以通过pub调用公共方法。methodName快捷方式表示法,而不是重复主名称:

var namedObjectModulePattern = function(){
  var pub = {};
  var privateVar = 1;
  function privateFunction(){
    alert('private');
  };
  pub.publicVar = 2;
  pub.publicFunction = function(){
  pub.anotherPublicFunction();    
  };
  pub.anotherPublicFunction = function(){
    privateFunction();
  };
  return pub;
}();
namedObjectModulePattern.publicFunction();

还有另一个选项,我在此称之为“揭示模块模式”。在这种排列中,您只需在私有范围内定义所有函数和变量,并在模块末尾返回一个匿名对象,其中包含指向要公开的私有变量和函数的指针:

var revealingModulePattern = function(){
  var privateVar = 1;
  function privateFunction(){
    alert('private');
  };
  var publicVar = 2;
  function publicFunction(){
    anotherPublicFunction();    
  };
  function anotherPublicFunction(){
    privateFunction();
  };
  // reveal all things private by assigning public pointers
  return {
    publicFunction:publicFunction,
    publicVar:publicVar,
    anotherPublicFunction:anotherPublicFunction
  }
}();
revealingModulePattern.publicFunction();

这使整个脚本的语法保持一致,并在结尾处显示出哪些函数和变量可以公开访问。另一个好处是,如果您愿意,可以用其他更具体的名称显示私有功能。

var revealingModulePattern = function(){
  var privateVar = 1;
  function privateFunction(){
    alert('private');
  };
  var publicVar = 2;
  function publicFunction(){
    anotherPublicFunction();    
  };
  function anotherPublicFunction(){
    privateFunction();
  };
  // reveal all things private by assigning public pointers
  return {
    init:publicFunction,
    count:publicVar,
    increase:anotherPublicFunction
  }
}();
revealingModulePattern.init();

您甚至可以通过调用匿名对象中的函数来返回值作为公共属性:

var revealingModulePattern = function(){
  var privateVar = 1;
  function privateFunction(){
    alert('private');
  };
  var publicVar = 2;
  function publicFunction(){
    anotherPublicFunction();    
  };
  function anotherPublicFunction(){
    privateFunction();
  };
  function getCurrentState(){
    return 2;
  };
  // reveal all things private by assigning public pointers 通过分配公共指针显示所有私有内容
  return {
    init:publicFunction,
    count:publicVar,
    increase:anotherPublicFunction,
    current:getCurrentState()
  }
}();
alert(revealingModulePattern.current) 
// => 2
revealingModulePattern.init();

当然,这里的示例名称与我在真实脚本中使用的名称相差很远,但它显示了这种模式的强大功能。

posted @ 2022-10-10 13:50  Running00  阅读(21)  评论(0编辑  收藏  举报