js模块和级联
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模块和级联的更多相关文章
- js模块开发(一)
现在嵌入页面里面的javascript代码越来越复杂,于是可能依赖也越来越严重,使用别人开发的js也越来越多,于是在理想情况下,我们只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 于是j ...
- 第三课:sea.js模块加载原理
模块加载,其实就是把js分成很多个模块,便于开发和维护.因此加载很多js模块的时候,需要动态的加载,以便提高用户体验. 在介绍模块加载库之前,先介绍一个方法. 动态加载js方法: function l ...
- JS模块规范 前端模块管理器
一:JS模块规范(为了将js文件像java类一样被import和使用而定义为模块, 组织js文件,实现良好的文件层次结构.调用结构) A:CommonJS就是为JS的表现来制定规范,因为js没有模块的 ...
- Node.js模块
每一个Node.js都是一个Node.js模块,包括JavaScript文件(.js).JSON文本文件(.json)和二进制模块文件(.node). mymodul.js function Hell ...
- 使用seajs封装js模块
//方法一:将函数绑定到原型上 define(function(require, exports, module) { $.fn.tab = function(option, callback) { ...
- nodejs js模块加载
本文地址:http://www.cnblogs.com/jasonxuli/p/4381747.html nodejs的非核心模块(core module)加载主要使用的就是module.js. 项目 ...
- js模块开发
js模块开发(一) 现在嵌入页面里面的javascript代码越来越复杂,于是可能依赖也越来越严重,使用别人开发的js也越来越多,于是在理想情况下,我们只需要实现核心的业务逻辑,其他都可以加载别人已经 ...
- 如何发布一个自定义Node.js模块到NPM(详细步骤)
咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...
- 【 js 模块加载 】深入学习模块化加载(node.js 模块源码)
一.模块规范 说到模块化加载,就不得先说一说模块规范.模块规范是用来约束每个模块,让其必须按照一定的格式编写.AMD,CMD,CommonJS 是目前最常用的三种模块化书写规范. 1.AMD(Asy ...
随机推荐
- SpringMVC无法获取请求中的参数的问题的调查与解决(1)
*更新:本文第一版中犯了比较大的错误,无论@RequestBody还是@RequestParam注解一样,都会使用全局的Encoding进行解码,会导致特殊编码的参数值丢失. 只要抛弃掉注解,就完全可 ...
- Exynos 4412 Uboot源码解析
原文地址:http://www.cnblogs.com/jacklu/p/6226330.html Exynos 4412 Uboot的汇编代码就不贴了,没有的可以私信我. 这是我当时阅读代码时的思维 ...
- openssl使用多种方法签名、自签名
1.自建CA 自建CA的机制:1.生成私钥2.创建证书请求,在创建证书请求过程中由于需要提供公钥,而公钥来源于私钥,所以也需要指定私钥来创建证书请求,而实际上这里提供私钥的作用就是提取其中的公钥,这一 ...
- ZOJ
某年浙大研究生考试的题目. 题目描述: 对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC. 是否AC的规则如下:1. zoj能AC:2. 若字符串形式为xzojx,则也能AC, ...
- html5的选择器
<body> <p class="aa">aaa</p> <p class="bb">bbb</p> ...
- ASP.NET泛型List的各种用法Skip、Take等
List在.NET里面使用得非常频繁,但有好多人不了解它各种小用法.我就一直记不大住... asp.net中List的简单用法,例如: 1 2 3 4 5 6 7 List<int> li ...
- leetcode 4. Median of Two Sorted Arrays
https://leetcode.com/problems/median-of-two-sorted-arrays/ There are two sorted arrays nums1 and num ...
- 照片灰蒙蒙?用PS的曲线功能来解决 (转)
原文地址:http://realjasonc.blog.163.com/blog/static/16475932520107594048957/ 上次,给大家看了几张较为典型的直方图.其实直方图的状态 ...
- mysql高性能索引策略
转载说明:http://www.nyankosama.com/2014/12/19/high-performance-index/ 1. 引言 随着互联网时代地到来,各种各样的基于互联网的应用和服务进 ...
- (转)maven配置之pom.xml配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...