zoukankan      html  css  js  c++  java
  • 私有变量

    私有变量

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

    如果在这个函数内部创建一个闭包,那么闭包通过自己的作用域链也可以访问这些变量。而利用这些变量,就可以创建用于访问私有变量的公有方法。

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

    特权方法:我们把有权访问私有函数的公有方法叫做特权方法。有两种在对象上创建特权方法的方式。利用私有和特权成员,可以隐藏那些不应该被直接修改的数据。

    第一种:在构造函数中定义特权方法

    (缺点:构造函数模式的缺点是针对每个实例都会创建同样一组新方法)

    第二种:静态私有变量

    静态私有变量

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

    (function(){
        //私有变量和私有函数
        var privateVariable = 10;
        
        function privateFunction(){
            return false;
        }
        
        //构造函数
        MyObject = function(){
        }
        
        //公有/特权方法
        MyObject.prototype.publicMethod = function(){
            privateVariable ++;
            return privateFunction();
        }    
    })();
    
    var object = new MyObject();
    console.log(object.publicMetho
    

    上面定义MyObject构造函数函数时,没有使用函数申明,而是使用了函数表达式。函数申明只能创建局部函数,那不是我们想要的。同时在用函数表达式定义函数时,也没有使用var关键字申明,未经申明的变量,就会创建一个全局变量。全局变量能够在私有作用域之外被访问。

    由于特权方法是在原型上定义的,因此所有的实例都使用同一个函数,而这个特权方法,作为一个闭包,总是保存着对包含作用域的引用。

    实例

    (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("Nicholas");
    alert(person1.getName());   //"Nicholas"
    person1.setName("Greg");
    alert(person1.getName());   //"Greg"
                                   
    var person2 = new Person("Michael");
    alert(person1.getName());   //"Michael"
    alert(person2.getName());   //"Michael"
    

    静态私有变量,任何时候都能从同一位置访问。在 Java 中,类可具有属性和方法,无需实例化该类的对象,即可访问这些属性和方法。上面例子的Person构造函数和getName()和setName()方法都能访问私有变量name,变量name就变成了一个静态的、所有实例共享的属性。也就是在一个实例上调用setName()会影响所有的实例。

  • 相关阅读:
    IIS网站应用偶尔出现"服务不可用"或者显示乱码字体
    mac os下切换pip3国内源并安装requests库
    mysql5.6运行一段时间之后网站页面出现乱码解决办法
    mac pro下安装安装 SymPy 和 matplotlib报错解决方案
    python3汉诺塔简单实现代码
    用python提取xml里面的链接源码
    Mac环境下 jieba 配置记录
    AngularJS 整理学习
    Java有关List的stream基本操作
    Callable的简单使用
  • 原文地址:https://www.cnblogs.com/YeChing/p/6361581.html
Copyright © 2011-2022 走看看