js模块和级联

1、模块

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

 1 var serial_maker = function(){
 2    var prefix = "";
 3    var seq = 0;
 4    return {
 5       set_prefix : function(pre){
 6          prefix = new String(pre);
 7       },
 8       set_seq : function(s){
 9          if(typeof s === "number"){
10             seq = s;
11          }else{
12             throw {
13                name : "ErrorType",
14                message: "seq must be number"
15              };
16           }
17        },
18        gensym : function(){
19           //序列号为前缀加序号
20           var result = prefix + seq;
21           seq += 1;
22           return result;
23        }
24    };
25 };
26 var seqer = serial_maker();
27 seqer.set_prefix("Q");
28 try{
29    seqer.set_seq(1000);
30    document.writeln(seqer.gensym());//Q1000
31    document.writeln(seqer.gensym());//Q1001
32    document.writeln(seqer.seq());//undefined
33    var seqer_2 = serial_maker();
34    document.writeln(seqer.gensym());//0
35 }catch(e){
36    document.write(e.name + ":" + e.message);
37 }

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

 1 var Serial_maker = function(){
 2    var prefix = "";
 3    var seq = 0;
 4    this.set_prefix = function(pre){
 5       prefix = new String(pre);
 6    };
 7    this.set_seq = function(s){
 8       if(typeof s === "number"){
 9          seq = s;
10       }else{
11          throw {
12             name : "ErrorType",
13             message: "seq must be number"
14          };
15        }
16     };
17     this.gensym = function(){
18        var result = prefix + seq;
19        seq += 1;
20        return result;
21     };
22 };
23 var seqer = new Serial_maker();
24 seqer.set_prefix("Q");
25 try{
26     seqer.set_seq(1000);
27     document.writeln(seqer.gensym());//Q1000
28     document.writeln(seqer.gensym());//Q1001
29     document.writeln(seqer.seq());//undefined
30 }catch(e){
31     document.write(e.name + ":" + e.message);
32 }


2、级联

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

 1 var serial_maker = function(){
 2    var prefix = "";
 3    var seq = 0;
 4    return {
 5       set_prefix : function(pre){
 6          prefix = new String(pre);
 7          return this;
 8       },
 9       set_seq : function(s){
10          if(typeof s === "number"){
11             seq = s;
12          }else{
13             throw {
14                name : "ErrorType",
15                message: "seq must be number"
16             };
17          }
18          return this;
19        },
20        gensym : function(){
21           //序列号为前缀加序号
22           var result = prefix + seq;
23           seq += 1;
24           return result;
25        }
26    };
27 };
28 var seqer = serial_maker();
29 seqer.set_prefix("Q");
30 try{
31     seqer.set_seq(1000);
32     document.writeln(seqer.set_prefix("Q").set_seq(1000).gensym());//Q1000,采用级联
33     document.writeln(seqer.gensym());//Q1001
34 }catch(e){
35     document.write(e.name + ":" + e.message);
36 }
时间: 2024-08-01 19:37:42

js模块和级联的相关文章

js模块开发(一)

现在嵌入页面里面的javascript代码越来越复杂,于是可能依赖也越来越严重,使用别人开发的js也越来越多,于是在理想情况下,我们只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 于是js模块化开发就显的越来越重要了,但是,Javascript不是一种模块化编程语言,它不支持"类"(class),更遑论"模块"(module)了.(正在制定中的ECMAScript标准第六版,将正式支持"类"和"模块",但还需要很

使用seajs封装js模块

//方法一:将函数绑定到原型上 define(function(require, exports, module) { $.fn.tab = function(option, callback) { function bootstrap() { console.log('djsakhdkj'); } bootstrap(); } $(function(){ $().tab();//因为将tab绑定到$原型上,所以要使用$().tab()去调用 }) }) //方法一(2):将函数绑定到jquer

Node JS 模块

require('./test'); 和require('./test.js');是一样的,系统会自动加上后缀引入test.js功能模块 如下是require.js文件 var sum=require('./sum.js');//引入sum.js模块 console.log(sum.sum());//sum(可以传递参数) 如下是sum.js文件 function sum(){//可传递参数 var sum=0;console.time('runTime');for(var i =0;i<=10

2015.3.12(遮罩层JS模块)

这两天了解了一些前端开发常用的工具和库和框架,有一个疑问,如果大量使用这些现成的框架,会不会导致大材小用呢?就是每一个页面都要加载一遍可能要用的框架和库,但实际上这个页面的实现只会用到一小部分,这样无形中就会拖慢速度或者是造成用户的流量浪费.这种问题要怎么解决呢?  没有开发经验啊,这种优化问题有点想不明白. 今天的练习需要一个可以用于点击图片放大图片以及用于替代系统自带的alert的遮罩层写了如下的js模块.方便在项目中直接调用. 下面是html部分的代码.只是在button的onclick事

Node.js模块封装及使用

Node.js中也有一些功能的封装,类似C#的类库,封装成模块这样方便使用,安装之后用require()就能引入调用. 一.Node.js模块封装 1.创建一个名为censorify的文件夹 2.在censorify下创建3个文件censortext.js.package.json.README.md文件 1).在censortext.js下输入一个过滤特定单词并用星号代替的函数. var censoredWorlds=["sad","bad","mad&

Node.js 模块和 NPM

1.模块概念 原生模块:Node.js API 提供的原生模块,原生模块在启动时已经被加载. 文件模块:动态加载模块,由原生模块 module 来实现和完成. 文件模块需要通过调用 require 方法来实现加载. Node.js 对两种模块都有缓存,不会重复开销去加载模块,只读取相应数据. 原生模块的调用 Node.js 的 API require 加载相应的 Node.js 模块,加载成功后返回一个 Node.js 模块对象. 该对象拥有该模块的所有方法和属性. var httpModule

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

咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着,以极少的文字说明以及极少的代码书写为原则来给大家演示! 文章中上传的模块不具备任何意义! 一.封装node.js模块时的必须项 1.创建package.json 每一个完整封装的node模块,必须含有一个参数明确的package.json文件! 以下为package.json的最精简配置: { "n

js模块化/js模块加载器/js模块打包器

之前对这几个概念一直记得很模糊,也无法用自己的语言表达出来,今天看了大神的文章,尝试根据自己的理解总结一下,算是一篇读后感. 大神的文章:http://www.css88.com/archives/7628(大神的文章写的很详细,建议先看完大神的文章) 一.js模块化 什么是js模块化,我们从历史说起. 1.一开始我们怎么写脚本?就是在html文件中用<script></script>写代码 这种方式的缺点:代码复用靠复制,基本是全局变量. 2.后来我们用js文件写代码,用<

node js 模块系统

Node.js模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码.JSON 或者编译过的C/C++ 扩展. 创建模块 在 Node.js 中,创建一个模块非常简单,如下我们创建一个 'hello.js' 文件,代码如下: var hello = require('./hello'); hello.w