什么是私有变量?任何在函数中定义的变量,都可认为是私有变量。包括
- 函数的参数
- 局部变量
- 函数内部定义的其他函数
利用闭包,可创建用于访问私有变量的公有方法(特权方法)。
特权方法:指有权访问私有变量和私有函数的公有方法。有两种在对象上创建特权方法。
- 构造函数内定义特权方法,如下
1 | function Myobject(){ |
- 利用私有和特权成员,可以隐藏那些不应该被直接修改的数据。
1 | function Person(name){ |
- 使用构造函数模式的缺点是针对每个实例都会创建同样一组新方法,而使用静态私有变量来实现特权方法就可以避免这个问题。
1.静态私有变量
- 通过在私有作用域创建私有变量或函数,同样也能创建特权方法。
- 函数声明只能创建局部函数
- 声明MyObject变量没有使用var关键字,为了创建全局变量。
1 | (function (){ |
- 静态私有变量模式与构造函数模式主要区别:私有变量和函数是由函数实例共享的。
2.模块模式
单例:只有一个实例的对象
模块模式:为单例创建私有变量和特权方法,使其得到增强。
语法如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17var singleton=function(){
//私有变量和私有函数
var privateVariable=10;
function privateFunction(){
return false;
}
//私有/公有方法和属性
return {
publicProperty:true;
publicMethod:function(){
privateVariable++;
return privateFunction();
}
};
}();代码说明:
- 使用一个返回对象的匿名函数
- 先定义私有变量和函数
- 再返回一个对象字面量
- 对象字面量中只包含可以公开的属性和方法,其公有方法可以访问私有变量和函数。
- 这个对象字面量定义的是单例的公共接口。
例如:
1 | var application=function(){ |
- 用途:必须创建一个对象并以某些数据对其进行初始化,同时还要公开一些能够访问这些私有数据的方法,那么就可以使用模块模式。
3.增强的模块模式
- 用途:单例必须是某种类型的实例,同时还必须添加某些属性和(或)方法对其加以增强的情况。
例子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21var singleton=function(){
//私有变量和私有函数
var privateVariable=10;
function privateFunction(){
return false;
}
//创建对象
var object=new CustomType();
//添加特权/公有属性和方法
object.publicProperty=true;
object.publicMethod=function(){
privateVariable++;
return privateFunction();
};
//返回这个对象
return object;
}();