JS 函数(6)—私有变量

私有变量

 

私有变量

任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数的外部访问这些变量。

私有变量包括函数的参数、局部变量和在函数中定义的其它函数。

 

特权方法:有权访问私有变量和私有函数的方法。

有两种在对象上创建特权方法的方式:其一是在构造函数中定义特权方法。

 1 function MyObject() {
 2     //私有变量和私有函数
 3     var privateVariable = 10;
 4     function privateFunction() {
 5         return true;
 6     }
 7     //特权方法
 8     this.publicMethod = function() {
 9         privateVariable++;
10         return privateFunction();
11     };
12 }

能够在构造函数中定义特权方法,是因为:特权方法作为闭包有权访问在构造函数中定义的所有变量和函数。

对这个例子而言,变量privateVariable和函数privateFunction只能通过特权方法访问。

 

利用私有变量和特权方法,可以隐藏那些不应该被直接修改的数据,例如:

 1 function Person(name) {
 2     this.getName = function() {
 3         return name;
 4     }
 5     this.setName = function(value) {
 6         name = value;
 7     }
 8 }
 9 var person = new Person("CC");
10 alert(person.getName());    //"CC"
11 person.setName("VV");
12 alert(person.getName());    //"VV"

 

构造函数的缺点:每一个新实例都会创建同样一组新方法。

 

静态私有变量

通过在私有作用域中定义私有变量或函数,也可以创建特权方法。

 1 (function() {
 2     //私有变量和私有函数
 3     var privateVariable = 10;
 4     function privateFunction() {
 5         return false;
 6     }
 7     //构造函数
 8     MyObject = function() {
 9     };
10     //特权方法
11     MyObject.prototype.publicMethod = function() {
12         privateVariable++;
13         return privateFunction();
14     };
15 })();

使用函数声明只能创建一个局部函数,这里并没有使用函数声明,也没有使用var关键字,为的就是创建一个全局变量,以方便在函数外部访问。

初始化未经声明的变量,总会创建一个全局变量。(在严格模式下,给未经声明的变量初始化会导致错误)

 

 1 (function() {
 2     var name = "";
 3     Person = function(value) {
 4         name = value;
 5     };
 6     Person.prototype.getName = function() {
 7         return name;
 8     };
 9     Person.prototype.setName = function(value) {
10         name = value;
11     };
12 })();
13 
14 var person1 = new Person("CC");
15 alert(person1.getName());    //"CC"
16 
17 var person2 = new Person("VV");
18 alert(person2.getName());    //"VV"
19 alert(person1.getName());    //"VV"

变量name变成一个静态的、由所有实例共享的属性。

静态私有变量会因为使用原型而增进代码复用,但所有的实例都没有自己的私有变量。

 

多查找作用域链的一个层次,就会在一定程度上影响查找速度。这正是使用闭包或者私有变量的不足之处。

 

模块模式

构造函数模式、原型模式,都是用于为自定义类型创建私有变量和特权方法。

而模块模式是为单例创建私有变量和模块方法。

所谓单例,是指只有一个实例的对象。

模块模式的语法:

 1 var singleton = function() {
 2     //私有变量和私有函数
 3     var privateVariable = 10;
 4     function privateFunction() {
 5         return true;
 6     };
 7     //特权方法
 8     return {
 9         publicProperty: true,
10         publicMethod: function() {
11             privateVariable++;
12             return privateFunction();
13         }
14     };
15 }

模块模式使用一个返回对象的匿名函数;将一个对象字面量作为函数的值返回。

从本质上讲,这个对象字面量定义的是单例的公共接口。

在需要对单例进行某些初始化,同时又需要维护其私有变量时,模块模式是非常有用的。

暂时不理解,有待补充。。。

 

posted @ 2016-08-10 19:12  Aaron_Xiao  阅读(1689)  评论(0)    收藏  举报