标签:
私有变量
私有变量
任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数的外部访问这些变量。
私有变量包括函数的参数、局部变量和在函数中定义的其它函数。
特权方法:有权访问私有变量和私有函数的方法。
有两种在对象上创建特权方法的方式:其一是在构造函数中定义特权方法。
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变成一个静态的、由所有实例共享的属性。
静态私有变量会因为使用原型而增进代码复用,但所有的实例都没有自己的私有变量。
多查找作用域链的一个层次,就会在一定程度上影响查找速度。这正是使用闭包或者私有变量的不足之处。
标签:
原文地址:http://www.cnblogs.com/cc156676/p/5758016.html