《JavaScript高级程序设计》读书笔记7.4私有变量

  • 什么是私有变量?任何在函数中定义的变量,都可认为是私有变量。包括

    • 函数的参数
    • 局部变量
    • 函数内部定义的其他函数
  • 利用闭包,可创建用于访问私有变量的公有方法(特权方法)。

  • 特权方法:指有权访问私有变量和私有函数的公有方法。有两种在对象上创建特权方法。

    1. 构造函数内定义特权方法,如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function Myobject(){
//私有变量和私有函数
var privateVariable=10;

function privateFunction(){
return false;
}

//特权方法
this.privateMethod=function(){
privateMthod++;
return privateFunction();
};
}
创建实例后,除了使用privateMethod()途径外,没有任何办法访问privateVariable和privateFunction();
  • 利用私有和特权成员,可以隐藏那些不应该被直接修改的数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function Person(name){

this.getName=function(){
return name;
};

this.setName=function(value){
name=value;
};
}

var person = new Person("Nicholas");
alert(person.getName()); //"Nicholas"
person.setName("Greg");
alert(person.getName()); //"Greg"
  • 使用构造函数模式的缺点是针对每个实例都会创建同样一组新方法,而使用静态私有变量来实现特权方法就可以避免这个问题。

1.静态私有变量

  • 通过在私有作用域创建私有变量或函数,同样也能创建特权方法。
    • 函数声明只能创建局部函数
    • 声明MyObject变量没有使用var关键字,为了创建全局变量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(function (){

//私有变量和私有函数
var privateVariable=10;

function privateFunction(){
return false;
}

//构造函数
MyObject=function(){
};

// 公有/特权方法
MyObject.prototype.publicMethod=function(){
privateMthod++;
return privateFunction();
};

})();
  • 静态私有变量模式与构造函数模式主要区别:私有变量和函数是由函数实例共享的。

2.模块模式

  • 单例:只有一个实例的对象

  • 模块模式:为单例创建私有变量和特权方法,使其得到增强。
    语法如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    var singleton=function(){

    //私有变量和私有函数
    var privateVariable=10;
    function privateFunction(){
    return false;
    }

    //私有/公有方法和属性
    return {
    publicProperty:true;
    publicMethod:function(){
    privateVariable++;
    return privateFunction();
    }
    };
    }();
  • 代码说明:

    • 使用一个返回对象的匿名函数
    • 先定义私有变量和函数
    • 再返回一个对象字面量
    • 对象字面量中只包含可以公开的属性和方法,其公有方法可以访问私有变量和函数。
    • 这个对象字面量定义的是单例的公共接口。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var application=function(){

//私有变量和函数
var components=new Array();

//初始化
components.push(new BaseComponent());

//公共
return {
getComponentCount:function(){
return components.length;
},
registerComponent:function(component){
if(typeof component=="object"){
components.push(component);
}
}
};
}();
  • 用途:必须创建一个对象并以某些数据对其进行初始化,同时还要公开一些能够访问这些私有数据的方法,那么就可以使用模块模式。

3.增强的模块模式

  • 用途:单例必须是某种类型的实例,同时还必须添加某些属性和(或)方法对其加以增强的情况。
    例子:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    var singleton=function(){

    //私有变量和私有函数
    var privateVariable=10;
    function privateFunction(){
    return false;
    }

    //创建对象
    var object=new CustomType();

    //添加特权/公有属性和方法
    object.publicProperty=true;
    object.publicMethod=function(){
    privateVariable++;
    return privateFunction();
    };

    //返回这个对象
    return object;
    }();
liborn wechat
欢迎您扫一扫上面的微信二维码,订阅我的公众号!