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 }
模块模式使用一个返回对象的匿名函数;将一个对象字面量作为函数的值返回。
从本质上讲,这个对象字面量定义的是单例的公共接口。
在需要对单例进行某些初始化,同时又需要维护其私有变量时,模块模式是非常有用的。
暂时不理解,有待补充。。。

浙公网安备 33010602011771号