JavaScript私有变量

私有变量


任何在函数中定义的变量,都可以认为是私有变量。私有变量包括:函数的参数、局部变量、函数内部定义的其他函数。
我们把有权访问私有变量和私有函数的公有方法称为特权方法。
利用私有变量,可以隐藏那些不应该被直接修改的数据。
示例:

function Person(name){
    this.getName = function(){
        return name;
    };
    this.setName = function(value){
        name = value
    };
}
var person = new Person("James");
console.log(person.getName());//"James"
person.setName("Harden");
console.log(person.getName());//"Harden"

上述例子中的两个特权方法均可以在构造函数外部使用,由于它们都是在构造函数内部定义的,所以它们都能够通过作用域链访问私有变量name。

注意:
在构造函数中定义特权方法有一个缺点,必须使用构造函数模式来达到目的,而构造函数模式的缺点就是会为每个实例创建同样的一组新方法。而使用静态私有变量可以避免这个问题。

静态私有变量


通过在私有作用域中定义私有变量和函数,同样可以创建特权方法。
基本模式如下:

(function(){
    //私有变量
    var name = "";

    //构造函数(函数表达式)
    Person = function(value){
        name = value;
    };
    //特权方法
    Person.prototype.getName = function(){
        return name;
    }
    Person.prototype.setName = function(value){
        name = value;
    }
})();

var person1 = new Person("James");
console.log(person1.getName());//"James"
var person2 = new Person("Harden");
console.log(person1.getName());//"Harden"
console.log(person2.getName());//"Haeden"

在此模式下,变量name就是一个静态的、由所有实例共享的属性。以这种模式创建静态私有变量,会因为使用原型而增进代码复用,但是每个实例都没有自己的私有变量。

模块模式


在叙述模块模式之前,先介绍一下单例的概念。
单例:只有一个实例的对象,JavaScript通过对象字面量的方式创建单例对象。如下:

var singleton = {
    name:value,
    method:function(){}
}

前面的模式是用于为自定义类型创建私有变量和特权方法。而模块模式是为单例创建私有变量和特权方法。
基本思想:使用一个返回对象的匿名函数,在匿名函数内部,首先定义私有变量和函数,然后将一个对象字面量作为匿名函数的值返回。
示例:

var singleton = function(){
    //私有变量和函数
    var privateNumber = 10;
    function privateFunction(){
        return false;
    }
    //特权方法和属性
    return{
        publicProperty:true,
        publicMethod:function(){
            privateNumber++;
            return privateFunction();
        }
    }
}();

模块模式在需要对单例进行一些初始化,同时又需要维护其私有变量时时非常有用的。也就是说,如果要创建一个对象,并以某些数据对其进行初始化,同时要公开一些能够访问这些私有数据的方法,那么就用模块模式。

增强的模块模式


此模式适用于那些单例必须是某种类型的实例,同时还必须添加某些属性和方法对其进行加强的情况。
示例:

var singleton = function(){
    //私有变量和私有函数
    var privateNumber = 10;
    function privateFUnction(){
        return false;
    }
    //创建特定类型的对象
    var object = new CustomType();

    //添加特权属性和方法
    object.publicProperty = true;
    object.publicMethod = function(){
        privateNUmber ++;
        return privateFunction();
    };
    //返回这个对象
    return object;
}();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值