在javascript中并不存在所谓的“类”的概念,但我们可以通过函数和闭包来构造模块,“模块”是一个提供接口但隐藏状态和实现的函数或对象(类似静态语言中的类)。
模块的一般形式是:一个定义了“私有变量”和函数的函数,利用闭包的特性(即创建了可以访问“私有变量和函数”的特权函数),最后将这些特权函数返回或保存到一个可以访问的地方。
通过模块方式可以摒弃全局变量的使用,而这也意味着我们避开了javascript语言最为糟糕的特性之一(全局污染),同时也促进了信息隐藏(安全)和其他优秀的设计实践。
下面是通过模块方式来创建安全的对象的一个例子,比如我们想要构造一个产生序列号的对象:
<pre>
function serial_maker() {
var prefix = ''
var seq = 0
return {
set_prefix: function (p) {
prefix = String(p)
},
gensym: function () {
var result = prefix + seq
seq++
return result
}
}
}
var seqer = serial_maker()
seqer.set_seq = function (i) {
seq = Number(i) // 改变的是全局变量seq
}
seqer.set_seq(3)
console.log(seqer.gensym() + '|' + seq) // 0 | 3</pre>
seqer对象是可变的,可以看到seqer创建后又赋予了它一个set_seq
的新方法,虽然看上去这个方法改变了seq
的值,但它改变的并不是闭包中的seq
,所以说“模块方式”保证了“私有变量”的安全性,只有模块内的方法才能对“私有变量”进行访问。