1、模块

模块模式的一般形式是:一个定义了私有变量和函数的函数,利用闭包创建可以访问私有变量和函数的特权函数,最后返回这个特权函数,或者把它们保存到一个可访问的地方。使用模块模式就可以摒弃全局变量的使用,它促进了信息隐藏和其他优秀的设计实践。对于应用程序的封装,或构造其他单例对象,模块模式非常有效。模块模式也可以用来产生安全的对象,如下例中我们想要构造一个用来产生序列号的函数:

 var serial_maker = function(){
var prefix = "";
var seq = 0;
return {
set_prefix : function(pre){
prefix = new String(pre);
},
set_seq : function(s){
if(typeof s === "number"){
seq = s;
}else{
throw {
name : "ErrorType",
message: "seq must be number"
};
}
},
gensym : function(){
//序列号为前缀加序号
var result = prefix + seq;
seq += 1;
return result;
}
};
};
var seqer = serial_maker();
seqer.set_prefix("Q");
try{
seqer.set_seq(1000);
document.writeln(seqer.gensym());//Q1000
document.writeln(seqer.gensym());//Q1001
document.writeln(seqer.seq());//undefined
var seqer_2 = serial_maker();
document.writeln(seqer.gensym());//
}catch(e){
document.write(e.name + ":" + e.message);
}

seqer包含的方法都没有用到this或that。因此没有办法损害seqer。除非调用对应的方法,否则没法改变prefix或seq的值。seqer对象时可变的,所以它的方法可能会替换掉,但替换后的方法依然不能访问私有成员。seqer就是一组函数的集合,而且那些函数被授予特权,拥有使用或修改私有状态的能力。上例可以采用构造函数的方式实现:

 var Serial_maker = function(){
var prefix = "";
var seq = 0;
this.set_prefix = function(pre){
prefix = new String(pre);
};
this.set_seq = function(s){
if(typeof s === "number"){
seq = s;
}else{
throw {
name : "ErrorType",
message: "seq must be number"
};
}
};
this.gensym = function(){
var result = prefix + seq;
seq += 1;
return result;
};
};
var seqer = new Serial_maker();
seqer.set_prefix("Q");
try{
seqer.set_seq(1000);
document.writeln(seqer.gensym());//Q1000
document.writeln(seqer.gensym());//Q1001
document.writeln(seqer.seq());//undefined
}catch(e){
document.write(e.name + ":" + e.message);
}

2、级联

有一些方法没有返回值,如果我们让这些返回this而不是undefined,就可以启用级联,如下例:

 var serial_maker = function(){
var prefix = "";
var seq = 0;
return {
set_prefix : function(pre){
prefix = new String(pre);
return this;
},
set_seq : function(s){
if(typeof s === "number"){
seq = s;
}else{
throw {
name : "ErrorType",
message: "seq must be number"
};
}
return this;
},
gensym : function(){
//序列号为前缀加序号
var result = prefix + seq;
seq += 1;
return result;
}
};
};
var seqer = serial_maker();
seqer.set_prefix("Q");
try{
seqer.set_seq(1000);
document.writeln(seqer.set_prefix("Q").set_seq(1000).gensym());//Q1000,采用级联
document.writeln(seqer.gensym());//Q1001
}catch(e){
document.write(e.name + ":" + e.message);
}

js模块和级联的更多相关文章

  1. js模块开发(一)

    现在嵌入页面里面的javascript代码越来越复杂,于是可能依赖也越来越严重,使用别人开发的js也越来越多,于是在理想情况下,我们只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 于是j ...

  2. 第三课:sea.js模块加载原理

    模块加载,其实就是把js分成很多个模块,便于开发和维护.因此加载很多js模块的时候,需要动态的加载,以便提高用户体验. 在介绍模块加载库之前,先介绍一个方法. 动态加载js方法: function l ...

  3. JS模块规范 前端模块管理器

    一:JS模块规范(为了将js文件像java类一样被import和使用而定义为模块, 组织js文件,实现良好的文件层次结构.调用结构) A:CommonJS就是为JS的表现来制定规范,因为js没有模块的 ...

  4. Node.js模块

    每一个Node.js都是一个Node.js模块,包括JavaScript文件(.js).JSON文本文件(.json)和二进制模块文件(.node). mymodul.js function Hell ...

  5. 使用seajs封装js模块

    //方法一:将函数绑定到原型上 define(function(require, exports, module) { $.fn.tab = function(option, callback) { ...

  6. nodejs js模块加载

    本文地址:http://www.cnblogs.com/jasonxuli/p/4381747.html nodejs的非核心模块(core module)加载主要使用的就是module.js. 项目 ...

  7. js模块开发

    js模块开发(一) 现在嵌入页面里面的javascript代码越来越复杂,于是可能依赖也越来越严重,使用别人开发的js也越来越多,于是在理想情况下,我们只需要实现核心的业务逻辑,其他都可以加载别人已经 ...

  8. 如何发布一个自定义Node.js模块到NPM(详细步骤)

    咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...

  9. 【 js 模块加载 】深入学习模块化加载(node.js 模块源码)

    一.模块规范 说到模块化加载,就不得先说一说模块规范.模块规范是用来约束每个模块,让其必须按照一定的格式编写.AMD,CMD,CommonJS 是目前最常用的三种模块化书写规范.  1.AMD(Asy ...

随机推荐

  1. FireDac 的RecordCount 相关测试 记录。

    unit Unit4; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  2. 关于js作用域链,以及闭包中的坑

    eg:链式作用域,想在外部读取blogName的值得方法 <script>var authorName="山边小溪";function doSomething(){   ...

  3. 微信官方demo(php)

    <?php /** * wechat php test */ //define your token define("TOKEN", "weixin"); ...

  4. 【转】Selenium 面试题总结(乙醇Blog记录的面试题)

    原文链接:http://www.cnblogs.com/tsbc/p/4922368.html ###selenium中如何判断元素是否存在? - isElementPresent   ###sele ...

  5. Linux下安装php环境并且配置Nginx支持php-fpm模块

    因为php安装需要编译,所以服务器应该保证gcc和g++环境的安装 首先释放安装包: tar -xvzf php-5.6.27.tar.gz cd php-5.6.27 接下来进行参数配置,配置前如果 ...

  6. html5 canvas画不出图像的原因

    很久没写博客了,今年过年的时候,家里出了意外,现在心里依然很难受.6月份之前一直忙着写毕业论文,答辩完6月初回公司继续上班,今天刚好周末有空,就写下之前碰到一个问题. 做一个图像查看器(基于Chrom ...

  7. VFP自定义函数StringFormat (仿.NET String.Format 方法)

    VFP仿.NET String.Format 方法 将指定字符串中的每个{x}替换为相应值,并返回文本 *-- 调用格式 StringFormat("日期{2},字符{1}",&q ...

  8. Linux驱动学习之常用的模块操作命令

    1.常用的模块操作命令 (1)lsmod(list module,将模块列表显示),功能是打印出当前内核中已经安装的模块列表 (2)insmod(install module,安装模块),功能是向当前 ...

  9. UGUI代码分析

    1.canvas,screen模式和world模式区别:screen的绑定摄像机与canvas相对位置不会改变不可改变canvas,world模式下有个event camera相对位置可改变,canv ...

  10. matlab的try/catch语句

    http://blog.sina.com.cn/s/blog_6fd1f2350102x2p3.html