多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 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; }(); ~~~