## 7.3 私有变量
严格来讲,JavaScript没有私有成员的概念;所有对象属性都是共有的,但存在私有变量的概念。
私有变量包括:**函数的参数、局部变量和在函数内部定义的其他函数**。
有权访问私有变量和私有函数的公有方法称为**特权方法**。有两种在对象上创建特权方法的方式:
* 在构造函数中定义特权方法
~~~
function MyObject(){
//私有变量和私有函数
var privateVariable = 10;
function privateFunction(){
return false;
}
//特权方法
this.publicMethod = function(){
privateVariable++;
return privateFunction();
};
}
~~~
特权函数作为**闭包**有权访问在构造函数中定义的所有变量和函数。
缺点:必须使用构造函数模式来达到目的,针对每个实例都会创建同一组新方法
### 7.3.1 静态私有变量
通过在**私有作用域**中定义私有变量或函数,即**静态私有变量**,同样也可以创建特权方法。
~~~
(function(){
//私有变量和私有函数
var privateVariable = 10;
function privateFunction(){
return false;
}
//构造函数
MyObject = function(){};
//公有、特权方法
MyObject.prototype.publicMethod = function(){
privateVariable++;
return privateFunction();
};
})();
~~~
这个模式与在构造函数中定义特权方法的主要区别,就在于私有变量和函数是由实例共享的。由于特权方法是在原型上定义的,因此所有实例都是用同一个函数。而这个特权方法,作为一个闭包,总是保存着对包含作用域的引用。以这种方式创建静态私有变量会因为使用原型而**增加代码复用**,但每个实例都**没有自己的私有变量**了。
### 7.3.2 模块模式
模块模式:是为**单例**创建私有变量和特权方法。所谓单例,指的就是**只有一个实例的对象**。
模块模式通过为单例添加私有变量和特权方法能够使其得到增强,通常以**对象字面量**创建单例对象,其语法形式如下:
~~~
var singleton = function(){
//私有变量和私有函数
var privateVariable = 10;
function privateFunction(){
return false;
}
//特权/公有方法和属性
return {
publiceProperty: true,
publicMethod: function(){
privateVariable++;
return privateFunction();
}
};
}();
~~~
由于这个返回的对象是在匿名函数内部定义的,因此它的公有方法有权访问私有变量和函数。从本质上讲,这个对象字面量定义的是单例的公共接口。这种模式在需要对单例进行某些初始化,同时又需要维护其私有变量时是非常有用的。例如:
~~~
var application = function(){
//私有变量和函数
var conponents = new Array();
//初始化
components.push(new BaseComponent());
//公共
return {
getComponentCount: function(){
return components.length;
},
registgerComponent: function(component){
if (typeof component == 'object'){
components.push(component);
}
};
}();
~~~
在web应用程序中,经常需要使用一个单例来管理应用程序级的信息。这个简单的例子创建了一个用于管理组件的application对象。在创建这个对象的过程中,首先声明了一个`私有的components`数组,并向这个数组添加了一个`BaseComponent`的新实例。而返回对象的`getComponentCount()和registerComponent()方法`,都是有权访问数组components的特权方法。前者只是返回已注册的组件数目,后者用于注册新组件。
简而言之,**如果必须创建一个对象并以某些数据对其进行初始化,同时还要公开一些能够访问这些私有数据的方法,那么就可以使用模块模式。**
### 7.3.3 增强的模块模式
增强的模块模式适合那些单例必须是**某种类型的实例**,同时还必须**添加某些属性和(或)方法**对其加以增强的情况。
改写前面的例子:
~~~
var application = function(){
//私有变量和函数
var conponents = new Array();
//初始化
components.push(new BaseComponent());
//创建application的一个局部副本
var app = new BaseComponent();
//公共接口
app.getComponentCount = function(){
return components.length;
};
app.registgerComponent = function(component){
if (typeof component == 'object'){
components.push(component);
}
};
//返回副本
return app;
}();
~~~
- 前言
- 第一章 JavaScript简介
- 第三章 基本概念
- 3.1-3.3 语法、关键字和变量
- 3.4 数据类型
- 3.5-3.6 操作符、流控制语句(暂略)
- 3.7函数
- 第四章 变量的值、作用域与内存问题
- 第五章 引用类型
- 5.1 Object类型
- 5.2 Array类型
- 5.3 Date类型
- 5.4 基本包装类型
- 5.5 单体内置对象
- 第六章 面向对象的程序设计
- 6.1 理解对象
- 6.2 创建对象
- 6.3 继承
- 第七章 函数
- 7.1 函数概述
- 7.2 闭包
- 7.3 私有变量
- 第八章 BOM
- 8.1 window对象
- 8.2 location对象
- 8.3 navigator、screen与history对象
- 第九章 DOM
- 9.1 节点层次
- 9.2 DOM操作技术
- 9.3 DOM扩展
- 9.4 DOM2和DOM3
- 第十章 事件
- 10.1 事件流
- 10.2 事件处理程序
- 10.3 事件对象
- 10.4 事件类型
- 第十一章 JSON
- 11.1-11.2 语法与序列化选项
- 第十二章 正则表达式
- 12.1 创建正则表达式
- 12.2-12.3 模式匹配与RegExp对象
- 第十三章 Ajax
- 13.1 XMLHttpRequest对象
- 你不知道的JavaScript
- 一、作用域与闭包
- 1.1 作用域
- 1.2 词法作用域
- 1.3 函数作用域与块作用域
- 1.4 提升
- 1.5 作用域闭包
- 二、this与对象原型
- 2.1 关于this
- 2.2 全面解析this
- 2.3 对象
- 2.4 混合对象“类”
- 2.5 原型
- 2.6 行为委托
- 三、类型与语法
- 3.1 类型
- 3.2 值
- 3.3 原生函数