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. xcode调试技巧

    xode报错有时挺无厘头,完全不知道哪里出的问题,最后还得用排除法,记录一些工作中认为有用的调试技巧 1.左侧视图点断点视图,左下角点加号,选择exception breakpoint,类型选c++, ...

  2. ADOConnectoin事务和存储过程中的Begin tran commit

    一直以来我都是在存储过程中使用事务 create proc usp_proc begin begin  tran ..... commit end 那么我现在问一个问题,如果在BCB的代码中写这样的代 ...

  3. DBTest/1.TestWrite fails: MDB_BAD_TXN: Transaction cannot recover - it must be aborted

    今天,终于把这个困扰我好久的问题解决了.心累之余,分享给大家. 主要问题是编译caffe的时候报错了: [----------] 5 tests from DBTest/1, where TypePa ...

  4. 使用小米天气API获取天气信息

    1. URL部分 以下url中"%s"代表的是城市Id,比如北京的cityId=101010100: //获取未来五天预报信息,红色部分信息不需要 WEATHER_DATA_URL ...

  5. 初学c# -- 学习笔记(五) winfrom无边框四周阴影

    刚用到这个功能,网上扯淡的东西太多了,都是2边阴影,还什么窗口叠加.ps作图啥的,什么玩意.还是老外实在,google找的,无边框窗体,四边透明阴影. public partial class For ...

  6. HTTPS (HTTP Secure)

    what is HTTPS HTTPS = HTTP + TSL Hypertext Transfer Protocol Secure (HTTPS) is acommunications proto ...

  7. C# 配置文件 AppSettings和ConnectionStrings的区别

      web.config是web应用程序的配置文件,为web应用程序提供相应配置(B/S).app.config是桌面应用程序的配置文件,为桌面应用程序提供相应配置(C/S).Configuratio ...

  8. iOS架构基础

    1.概念:架构其实是一个设计上的东西,它可以小到类类之间的交互,可以大到不痛的模块之间,可以说不痛的业务部门之间的交互都可以从架构的层面去理解它. 2.解耦 方法一:代理 方法二:通知

  9. Fortran 笔记

    1.将字符串写入文本 open(,File=trim("e:\XRIVER_LOG.txt"), ACCESS = 'APPEND')!ACCESS = 'APPEND' 在文本末 ...

  10. 轻型的ORM类Dapper

    Dapper是一个轻型的ORM类.代码就一个SqlMapper.cs文件,主要是IDbConnection的扩展方法,编译后就40K的一个很小的dll.官方站点http://code.google.c ...