对象创建模式之模块模式(Module Pattern)
模块模式可以提供软件架构,为不断增长的代码提供组织形式。JavaScript没有提供package的语言表示,但我们可以通过模块模式来分解并组织代码块,这些黑盒的代码块内的功能可以根据不断变化的软件需求而不断的被添加,替代和删除。模块模式由几种我们已经介绍过的模式共同组成:
- 命名空间模式
- 即时函数模式
- 私有成员与访问控制方法模式
- 依赖声明模式
模块模式的第一步是建立一个命名空间。首先我们用先前介绍的namespace()方法创建一个工具模块例子,这个例子模块提供一些数组功能:
MYAPP.namespace('MYAPP.utilities.array');
下一步就是定义这个模块。模块模式使用即时函数中的局部作用域来存放私有代码段。即时函数返回一个对象,该对象实际上就是被定义模块的公用接口,使用该模块的程序员可以通过这个对象来获得该模块提供的功能:
MYAPP.utilities.array = (function() {
    return {
        // todo...
    };
} ());
下面为这个模块增加一些公有的方法:
MYAPP.utilities.array = (function() {
    return {
        inArray: function(needle, haystack) {
            // ...
        },
        isArray: function(a) {
            // ...
        }
    };
} ());
利用即时函数提供的局部作用域,可以在即时函数体的上部,给出模块的依赖关系,私有属性,以及需要初始化的代码。最后,这个即时函数返回需要创建的模块的公有访问接口对象:
MYAPP.namespace('MYAPP.utilities.array');
MYAPP.utilities.array = (function() {
    // dependencies
    var uobj = MYAPP.utilities.object,
    ulang = MYAPP.utilities.lang,
    // private properties
    array_string = "[object Array]",
    ops = Object.prototype.toString;
    // private methods
    // ...
    // end var
    // optionally one-time init procedures
    // ...
    // public API
    return {
        inArray: function(needle, haystack) {
            for (var i = 0,
            max = haystack.length; i < max; i += 1) {
                if (haystack[i] === needle) {
                    return true;
                }
            }
        },
        isArray: function(a) {
            return ops.call(a) === array_string;
        }
        // ... more methods and properties
    };
} ());
以上就是模块模式的基本思路。模块模式是组织JavaScript代码的常用模式,推荐在软件开发中经常使用。
1. 模块的揭露模式
上面的模块模式例子中,公有方法是直接声明的。结合之前介绍的揭露模式,可以把所有模式中的方法都先声明为私有,然后再通过揭露模式,把私有的方法通过公有的接口方法展示出来。据此,上面的例子可以这样写:
MYAPP.utilities.array = (function() {
    // private properties
    var array_string = "[object Array]",
    ops = Object.prototype.toString,
    // private methods
    inArray = function(haystack, needle) {
        for (var i = 0,
        max = haystack.length; i < max; i += 1) {
            if (haystack[i] === needle) {
                return i;
            }
        }
        return ? 1;
    },
    isArray = function(a) {
        return ops.call(a) === array_string;
    };
    // end var
    // revealing public API
    return {
        isArray: isArray,
        indexOf: inArray
    };
} ());
2. 通过构造函数创建的模块
以上的例子中都是直接返回对象,有时候使用构造函数要更方便一些。使用构造函数的模块模式与上面例子的区别就在于返回的是一个函数,而不是一个字面声明的对象:
MYAPP.namespace('MYAPP.utilities.Array');
MYAPP.utilities.Array = (function() {
    // dependencies
    var uobj = MYAPP.utilities.object,
    ulang = MYAPP.utilities.lang,
    // private properties and methods...
    Constr;
    // end var
    // optionally one-time init procedures
    // ...
    // public API -- constructor
    Constr = function(o) {
        this.elements = this.toArray(o);
    };
    // public API -- prototype
    Constr.prototype = {
        constructor: MYAPP.utilities.Array,
        version: "2.0",
        toArray: function(obj) {
            for (var i = 0,
            a = [], len = obj.length; i < len; i += 1) {
                a[i] = obj[i];
            }
            return a;
        }
    };
    // return the constructor
    // to be assigned to the new namespace
    return Constr;
} ());
使用构造函数来声明的模块,可以这样调用:
var arr = new MYAPP.utilities.Array(obj);
3. 把global对象引入到模块中
模块声明时使用的即时函数可以接受需要的参数,这些参数可以根据设计的需要来引入。一个常用的做法是把global作为参数引入进来,这样全局对象就本地化了(Localized),可以加速对全局变量的访问:
MYAPP.utilities.module = (function(app, global) {
    // references to the global object
    // and to the global app namespace object
    // are now localized
} (MYAPP, this));
转载地址:http://zihui.lin.blog.163.com/blog/static/7292115420127781426279/
对象创建模式之模块模式(Module Pattern)的更多相关文章
- 初涉JavaScript模式 (11) : 模块模式
		引子 这篇算是对第9篇中内容的发散和补充,当时我只是把模块模式中的一些内容简单的归为函数篇中去,在北川的提醒下,我才发觉这是非常不严谨的,于是我把这些内容拎出来,这就是这篇的由来. 什么是模块模式 在 ... 
- javascript模式之模块模式
		使用模式来组织代码有很多优点:使代码的结构更清晰,逻辑性更强,更容易维护.还可以避免很多错误. 首先,在javascript主要分为两大类: 编程模式-- 一些专门为javascript语言开发出的最 ... 
- JavaScript基础对象创建模式之模块模式(Module Pattern)(025)
		模块模式可以提供软件架构,为不断增长的代码提供组织形式.JavaScript没有提供package的语言表示,但我们可以通过模块模式来分解并组织 代码块,这些黑盒的代码块内的功能可以根据不断变化的软件 ... 
- 【JavaScript回顾】对象创建的几种模式
		组合使用构造函数模式和原型模式 创建自定义类型的常见方式,就是组合使用构造函数模式与原型模式.构造函数模式用于定义实 例属性,而原型模式用于定义方法和共享的属性.结果,每个实例都会有自己的一份实例属性 ... 
- Eclipse创建Maven多模块工程Module开发(图文教程)
		自己研究了下Eclipse用Maven多模块工程Module开发,跟大家分享一下! 功能模块来分Module,跟java的package类似,一般是按照的功能模块分module,比如:sso/cas/ ... 
- 《JavaScript 模式》读书笔记(5)— 对象创建模式2
		这一篇,我们主要来学习一下私有属性和方法以及模块模式. 三.私有属性和方法 JavaScript并没有特殊的语法来表示私有.保护.或公共属性和方法,在这一点上与Java或其他语言是不同的.JavaSc ... 
- 《JavaScript 模式》读书笔记(5)— 对象创建模式4
		我们学完了大部分对象创建模式相关的内容,下面还有一些小而精的部分. 七.对象常量 JavaScript中没有常量的概念,虽然许多现代的编程环境可能为您提供了用以创建常量的const语句.作为一种变通方 ... 
- JavaScript基础对象创建模式之命名空间(Namespace)模式(022)
		JavaScript中的创建对象的基本方法有字面声明(Object Literal)和构造函数两种,但JavaScript并没有特别的语法来表示如命名空间.模块.包.私有属性.静态属性等等面向对象程序 ... 
- JavaScript设计模式-单例模式、模块模式(转载   学习中。。。。)
		(转载地址:http://technicolor.iteye.com/blog/1409656) 之前在<JavaScript小特性-面向对象>里面介绍过JavaScript面向对象的特性 ... 
随机推荐
- Docker安装,基本概念,执行流程,生命周期简介
			Docker基本概念 在使用Docker前,首先要先知道Docker中这几个常用的概念: 镜像:镜像是文件,只读的,提供了运行完整软硬件应用程序的集装箱. 容器:是镜像的实例,由Docker负责创建, ... 
- 一个web项目中web.xml<context-param>的作用
			转 <context-param>的作用:web.xml的配置中<context-param>配置作用1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置 ... 
- Win10下用selenium、Image.crop() 截图时、坐标不准确的问题
			截百度按钮的图 先将整个窗口的图保存下来 from selenium import webdriver driver = webdriver.Chrome() driver.get('https:// ... 
- 五十、在SAP程序中应用其他单元,INCLUDE的用法
			一.在SAP程序中写入以下代码 二.双击引用的单元,会弹出以下窗口 三.点击是 四.点击保存 五.保存在本地 六.此文件被包含进来 七.我们把在GET_DATA和SHOW_DATA写到INCLUDE里 ... 
- Linux 下 zip 文件解压乱码如何解决
			作者:Latm Ake链接:https://www.zhihu.com/question/20523036/answer/35225920来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ... 
- C#获取刚插入的数据的id
			在开发程序中我们经常会遇到两个表或多个表关联同时插入数据的需求. 那么我们刚给主表插入一条数据,接着给副表插入数据时其中一个字段要存储与主表关联的id,那么我们该怎么获取刚插入的那条数据的id呢? ... 
- Origin中使用CopyPage复制图片到Word后比例失调解决办法
			Origin画图的优势很多,其图形美观易于操作.对我而言,Origin最大的优点就是与Word兼容,在Origin操作界面空白处直接使用右键CopyPage命令,然后在Word中使用粘贴命令即可插入图 ... 
- html 基础  (9.19 第八天)
			一.HTML:超文本标记语言,是一种标签语言,不是编程语言,显示数据有双标签<body></body> 和单标签<img src=# / >, 标签大小写都可以通过 ... 
- SpringBoot的ApplicationRunner和CommandLineRunner
			如果你需要在你的SpringBoot启动完成之后实现一些功能,那么可以通过创建class实现ApplicationRunner和CommandLineRunner来完成: @Component pub ... 
- 项目版本回退后出现java compiler level does not match the version of the installed java project facet错误的解决
			今天项目出问题了,采取了项目版本回退的方法解决了代码不能够下拉和上送的问题以后,出现如下错误,项目是微服务的,更新相关的依赖项目,仍得不到解决,检查mapper.xml文件亦没问题.然后在控制台那块发 ... 
