javascript私有变量

私有变量

严格来说,javascript是没有私有成员的概念的,所有对象属性都是公开的。

不顾,任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数外部访问这些变量。私有变量包括函数参数,局部变量以及在函数内部定义的其他函数。通过上一节对闭包概念的学习,可以知道,虽然外部无法访问函数内部的私有变量,但闭包函数却能始终持有这些私有变量,并在外部访问。

如下,通过创建闭包,利用其作用域链提供私有变量的公有访问方法:

function MyObject(){
    //私有变量和私有函数
    var privateVariable = 20;
    function privateFunction(){
       return true;
    }
    
    //共有方法
    this.publicMethod = function(){
          privateVariable ++;
          return privateFunction();
    }
}   

这是一个构造函数,当函数执行完毕,本身的作用域链将被销毁,然而却有实例持有函数中的变量对象,因此其中的变量不会被销毁。

于是,每个实例都有了自己的私有成员,且互不影响。

但是,问题是共有方法是在构造函数中定义的,因为想要访问这些私有变量只能这样,于是每次调用构造函数都会重新创建共有方法。这就相当于只能使用构造函数模式来达到目的,缺点是每个实例会创建同样的方法,下面将使用静态私有变量来解决这个问题。


静态私有变量

基本模式如下:

(function(){
    //私有变量和函数 
    var privateVariable = 20;
    function privateFunction(){
       return true;
    }
    //构造函数
    MyObject = function(){};
    //共有方法
    MyObject.prototype.publishMethod = function(){
       privateVariable++;
        return privateFunction();
    }
})();
  1. 想要定义的函数立刻执行,那么就要在方法外加一层括号,在最后加一对括号
  2. 之所以要用这种立即执行的函数,是因为想要这一个代码块中变量不被外界使用,即私有作用域
  3. 没有用函数声明的方式定义构造函数,是因为不能定义局部函数,局部函数会在私有作用域结束后销毁
  4. MyObject没有var声明,因为我们希望MyObject是一个全局变量,这样才能在外界创建实例
  5. 方法定义在了原型上,使用原型模式而不是构造函数模式

但是,这种方式下创建的静态私有变量是被所有实例共享的,一旦某个实例修改该变量,那么所有实例都会被影响。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值