美文网首页
关于JS的闭包和公有私有变量属性研究

关于JS的闭包和公有私有变量属性研究

作者: 郝特么冷 | 来源:发表于2017-09-06 13:44 被阅读126次

    认识在js中的公有和私有变量

    function car(){ 
        var wheel = 3;//私有变量 
        this.wheel = 4;//公有变量 
        alert(wheel); 
        alert(this.wheel); 
    } 
    

    这里创建的都是私有变量 sum num1 num2

    function sum(num1, num2) {
            var sum = num1 + num2;
            return sum;
        }
    

    我们怎么才能访问到函数内部的私有变量,怎么才能修改函数内部的私有变量。
    下面我简单说下关于函数内部私有和公有变量的一些处理办法。
    如果在这个函数内部创建一个闭包,那么闭包通过自己的作用域链也可以访问这些变量,利用这一点,就可以创建用于访问私有变量的公用方法。

    我们把有权访问私有变量和私有函数的公有方法叫做特权方法。

    • 1.构造函数定义法
    function myObject() {
            //私有属性和私有函数
            var privateVariable = 10;
            function privateFunction() {
                return privateVariable;
            }
            //特权方法
            this.publicMethod = function() {
                privateVariable++;
                return privateFunction();
            }
        }
    var object1 = new myObject();
        //访问了函数内部的局部变量即私有变量
    console.log(object1.publicMethod());
    
    function Person(name) {
            this.getName = function() {
                return name;
            };
            this.setName = function(value) {
                name = value;
            };
        }
        //创建对象实例
        var person = new Person("李雷");
        console.log(person.getName());
        person.setName("韩梅梅");
        console.log(person.getName());
    

    在以上构造函数中定义了两个特权方法:getName()和setName()。这两个方法都可以在函数外部使用,而且都有权访问私有变量name。

    • 2.静态私有变量
      通过在私有作用域中定义私有变量或函数,同样也可以创建特权方法
    (function() {
            //私有变量和私有函数
            var privateVariable = 10;
            function privareFunction() {
                return false;
            };
            //构造函数
            MyObject = function() {}
            //公有、特权方法
            MyObject.prototype.publicMethod = function() {
                privateVariable++;
                privareFunction();
            }
        })();
    
    (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("lilei");
        console.log(person1.getName());
        person1.setName("hanmeimei");
        console.log(person1.getName());
    
        var person2 = new Person("mahuateng");
        console.log(person1.getName());
        console.log(person2.getName());
    
    • 3.模块模式
      模块模式是为单例创建私有变量和特权方法,单例就是指,只有一个实例的对象。
    var singlton = {
            name: value,
            method: function() {
                //这是方法的代码 
            }
        }
    
    var singlton = function() {
            //私有变量和私有函数   
            var privateVaiable = 10;
            function privateMethod() {
                return false;
            };
            //公有/特权方法   
            return {
                publicProperty: true,
                piblicMethod: function() {
                    privateVaiable++;
                    return privateMethod();
                }
            }
        }();
    
    function BaseComponent() {}
    
        function OtherComponent() {}
        var application = function() {
            //私有变量和函数
            var components = new Array();
    
            //初始化
            components.push(new BaseComponent());
    
            //公有
            return {
                getComponentCount: function() {
                    return components.length;
                },
    
                registerComponent: function(component) {
                    if(typeof component == "object") {
                        components.push(component);
                    }
                }
            };
        }();
    
        application.registerComponent(new OtherComponent());
        alert(application.getComponentCount()); //2
    
    • 4.增强的模块模式
    var singlton = function(){
    
            //私有变量和私有函数   
            var privateVaiable = 10;
    
            function privateMethod() {
                return false;
            };
            //创建对象 
            var object = new CustomType();
    
            //公有/特权方法   
            object.publicProperty = true;
    
            object.piblicMethod = function() {
                privateVaiable++;
                return privateMethod();
            };
            //返回这个对象 
            return object;
        }();
    
    function BaseComponent() {}
    
        function OtherComponent() {}
    
        var application = function() {
    
            //私有变量和私有函数   
            var components = new Array();
    
            //创建对象 
            components.push(new BaseComponent());
    
            //创建application的一个局部副本
            var app = new BaseComponent();
    
            //公共
            app.getComponentCount = function() {
                return components.length;
            };
    
            app.registerComponent = function(component) {
                if(typeof component == "object") {
                    components.push(component);
                }
            };
    
            //返回这个副本
            return app;
        }();
    
        alert(application instanceof BaseComponent);
        application.registerComponent(new OtherComponent());
        alert(application.getComponentCount()); //2
    

    相关文章

      网友评论

          本文标题:关于JS的闭包和公有私有变量属性研究

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