本文实例讲述了JavaScript私有变量。分享给大家供大家参考,具体如下:
任何在函数中定义的变量,就是私有变量,因为这些变量在函数外部是无法访问到的。总的来说,私有变量包括函数的参数、局部变量和在函数内部定义的其他函数。
function add(num1, num2){ var sum = num1 + num2; return sum;}
上面的例子中的 num1, num2, sum 就是函数的私有变量。
如果在这个函数内部创建一个闭包,那么闭包通过自己的作用域链也可以访问这些变量,利用这一点,就可以创建用于访问私有变量的公有方法。
有权访问私有变量和私有函数的公有方法叫做特权方法。
1. 构造函数模式
创建特权方法的方式有两种,第一种是在构造函数中定义:
function MyObject(){ //私有变量 var privateVariable = 10; //私有函数 function privateFunction(){ return false; } //特权方法 this.publicMethod = function(){ privateVariable++; return privateFunction(); };}
这里定义的的特权方法是一个闭包,所以能够访问在构造函数中定义的私有变量和私有函数。在创建 MyObject 实例后,只能通过特权方法来访问定义的私有变量和函数。
利用这种技术,可以隐藏那些不能被外部直接修改的数据:
function Person(name){ this.getName= function () { return name; }; this.setName= function (value) { name=value; }}var person=new Person("deniro");console.log(person.getName());//deniroperson.setName("lily");console.log(person.getName());//lily
上面的代码定义了两个特权方法,它们都可以在函数外部被调用,因为它们是闭包,所以可以通过作用域访问 name。name 在 Person 的每一个实例中都不同,因为每次调用构造函数都会重新创建这两个方法。
在构造函数中创建特权方法的缺点是,必须使用构造函数模式来实现,而这样做会在每个实例上创建同样的一组新方法!
2. 静态私有变量模式
通过在私有作用域中定义私有变量和函数,也可以创建特权方法,基本模式是:
(function(){ //私有变量 var privateVariable = 10; //私有函数 function privateFunction(){ return false; } //构造函数 MyObject = function(){ }; //公有/特权方法 MyObject.prototype.publicMethod = function(){ privateVariable++; return privateFunction(); };})();
公有方法在原型上定义,使用的原型模式。另外,我们使用的是函数表达式来定义构造函数,而且没有用 var,这种在初始化时未经声明的变量,就会创建一个全局变量。因此,MyObject 就成了一个全局变量,能够在私有作用域之外被访问到。但在严格模式下给未经声明的变量赋值会导致错误。
新闻热点
疑难解答
图片精选