【JavaScript学习】函数表达式:私有变量

1、任何在函数中定义的变量,都可以认为是私有变量,不能在函数外部访问这些变量。
2、私有变量包括:函数的参数、局部变量、在函数内部定义的其他函数。

在函数内部创建一个闭包,那么闭包通过自己的作用域链可以访问私有变量。

特权方法:有权访问私有变量和私有函数的公有方法。

在构造函数中定义特权方法

function MyObject(){
    //私有变量和私有函数
    var privateVariable = 10;
    function privateFunction(){
        return false;
    }

    //特权方法
    this.publicMethod = function () {
        privateVariable++;
        return privateFunction();
    }
}

利用私有和特权成员,可以隐藏不应该被直接修改的数据。

function Person(name) {
    this.getName = function () {
        return name;
    }
    this.setName = function (value) {
        name = value;
    }
}
var person = new Person("Wonder");
alert(person.getName());  //Wonder
person.setName("Greg");
alert(person.getName());  //Greg

使用静态私有变量来定义特权方法

(function(){
    //私有变量和私有函数
    var privateVariable = 10;
    function privateFunction(){
        return false;
    }

    //构造函数
    MyObject = function(){};  //——>MyObject是全局函数(未使用var关键字)

    //公有/特权方法
    MyObject.prototype.publicMethod = function () {
        privateVariable++;
        return privateFunction();
    };
})();

与在构造函数中定义特权方法的区别:
私有变量和函数是由实例共享的。特权方法是在原型上定义的,因此所有实例都使用同一个函数。

(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("Wonder");
alert(person1.getName());  //Wonder
person1.setName("Greg");
alert(person1.getName());  //Greg

var person2 = new Person("Abby");
alert(person1.getName());  //Abby
alert(person2.getName());  //Abby

模块模式

前面两种模式用于为自定义类型创建私有变量和特权方法。
模块模式为单例创建私有变量和特权方法。

单例:只有一个实例的对象。

//以对象字面量方式创建单例对象。
var singleton = {
    name:value,
    method:function(){
        //方法代码
    }
};

模块模式通过为单例添加私有变量和特权方法能够使其得到增强:

var singleton = function () {
    //私有变量和私有函数
    var privateVariable = 10;
    function privateFunction(){
        return false;
    }

    //特权/共有方法和属性
    return{
        publicProperty:true,
        publicMethod: function () {
            privateVariable++;
            return privateFunction();
        }
    }
}();

优点:
这种模式在需要对单例进行某些初始化,同时又需要维护其私有变量时非常有用。

var application = function () {
    //私有变量和私有函数
    var componets = new Array();

    //初始化
    componets.push(new BaseComponet());

    //公共
    return {
        getComponetCount: function () {
            return componets.length;
        },
        registerComponent: function (component) {
            if(typeof  component == "object"){
                componets.push(component);
            }
        }
    }
}();

增强的模块模式

在返回对象之前加入对其增强的代码。
适用于:
单例是某种类型的实例,同时还必须添加某些属性和(或)方法对其加以增强的情况。

var singleton = function () {
    //私有变量和私有函数
    var privateVariable = 10;
    function privateFunction(){
        return false;
    }

    //创建对象
    var object = new CustomType();

    //添加特权/共有方法和属性
    object.publicProperty = true;
    object.publicMethod = function () {
        privateVariable++;
        return privateFunction();
    };
    return object;
}();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值