js 模块模式

在js的懒汉式单例模式中,其实也用到了另一种设计模式,即模块模式。在传统软件工程中,模块模式被定义为给类提供私有和公共封装的一种方法,也就是我们常说的“模块化”。在Java里面Class就是一种模块,解决了属性、方法的封装问题,它的模块模式直接就融合到语言特性里面了,因此也没什么模块模式的说法;然而对于JavaScript这种过于灵活的语言,这种最基本的私有化封装却需要用一个设计模式来解决了。

在JavaScript中,“private”是作为保留字,而不是关键字的,也就是说,JavaScript没有私有化这一功能(纠结吧)。解决解决这问题有两种方法,一是定义变量的时候在前面加上下划线“_”,也就是告诉其他开发者,不要动这个变量哟;另一种则是利用闭包。第一种方法并不是真正的私有,只是一种规范,如果要做到真正的私有,还是要用第二种方法——闭包。
我们创建一个匿名函数,然后立即运行它,此匿名函数中的所有代码都存在于一个“闭包”之中,从而得到私有性,并在特定作用域中保持可被访问。

(function () {  
   //此作用域的所有变量、函数依旧可在特定作用域中被访问  
})(); 

var Module = (function () {  
   var my={},  
       privateVar = 8;//私有属性  
   function privateFun() {//私有方法  
       return ++privateVar;  
   };  
   my.publicVar = 1;//公共属性  
   my.moduleFun = function () {//公共方法  
       return privateFun();  
   };  
   return my;  
}());  
console.log(Module.publicVar);//1  
console.log(Module.publicFun());//9

在匿名函数中我们返回了一个my变量给Module作为外部访问闭包内容的接口,除闭包内my之外的内容都得到了私有性保护,闭包的数据在Module变量的作用域中保持可以访问。

好了,模块模式解决了JavaScript私有化的问题,我们可以利用它来定义命名空间、单例、拥有私有化封装的对象等等。然而模块模式也并非尽善尽美。例如,我们定义私有、公共变量的方法是不同的,当开发过程中我们需要改变某个变量的可见性的时候,就不得不在它所有出现过的地方进行修改;并且JavaScript作为动态编译的语言,我们可以随时给对象添加属性、方法,然而我们在闭包之外定义的方法是无法直接访问私有数据的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,678评论 25 708
  • 前言 本来对于js中模块模式这个词还没有很清晰的定义,但在看一个小项目的时候发现了用模块模式定义工具函数的作用,而...
    一点红3340阅读 551评论 0 0
  • 当一个javascript文件很大的时候,会出现一些问题:1.里面定义了大量的变量,你不得不把变量的名字写的越来越...
    我是渐渐呀阅读 404评论 0 0
  • 一、Module模式 最初被定义为一种在传统软件工程中为类提供私有和公有封装的方法。 在js中,Module模式用...
    50153465fcd8阅读 222评论 3 0
  • 很多人都在感慨,知道很多道理,依然过不好这一生。许多人也在追问,如何才能知道道理,过好这一生。套用李笑来老...
    如雾如电阅读 132评论 0 0