ES5中的私有变量

严格来讲,JavaScript中没有私有成员的概念;所有对象属性都是公有的。不过,倒是有一个私有变量的概念。任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数的外部访问这些变量。私有变量包括函数的参数、局部变量和在函数内部定义的其他函数。来看下面的例子:

function Person(name, age){
    var description = 'test';
}

在这个函数内部,有3个私有变量:nameagedescription。在函数内部可以访问这几个变量,但在函数外部则不能访问它们。如果在这个函数内部创建一个闭包,那么闭包通过自己的作用域链也可以访问这些变量。而利用这一点,就可以创建用于访问私有变量的公有方法。

我们把有权访问私有变量和私有函数的公有方法称为特权方法。有两种在对象上创建特权方法的方式。第一种是在构造函数中定义特权方法,基本模式如下:

function Person(name, age){
    var description = 'test';
    this.getName = function(){
        return name;
    }
    this.setName = function(value){
        name = value;
    }
}
var p = new Person('Bob', 18);
console.log(p.getName());// Bob
p.setName('Jack');
console.log(p.getName());// Jack

以上代码的构造函数中定义了两个特权方法:getNamesetName。这两个方法都可以在构造函数外部使用,而且都有权访问私有变量name。但在Person构造函数外部,没有任何办法访问name

由于这两个方法是在构造函数内部定义的,它们作为闭包能够通过作用域链访问name

不过,在构造函数中定义特权方法也有一个缺点,那就是你必须使用构造函数模式来达到这个目的。在之前系列文章中讲过,构造函数模式又有针对每个实例都会创建同样一组新方法的缺点。

下一篇文章,也就是创建特权方法的第二种方式——静态私有变量,就来讨论如何避免这个问题。

转载于:https://my.oschina.net/bob1900/blog/3064913

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值