美文网首页
【函数表达式】私有变量

【函数表达式】私有变量

作者: Wonder233 | 来源:发表于2017-11-17 11:47 被阅读0次

    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;
    }();
    

    相关文章

      网友评论

          本文标题:【函数表达式】私有变量

          本文链接:https://www.haomeiwen.com/subject/aczdvxtx.html