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()会影响所有的实例。

  • 相关阅读:
    119. Pascal's Triangle II
    118. Pascal's Triangle
    112. Path Sum
    111. Minimum Depth of Binary Tree
    110. Balanced Binary Tree
    108. Convert Sorted Array to Binary Search Tree
    88. Merge Sorted Array
    83. Remove Duplicates from Sorted List
    70. Climbing Stairs
    陌陌面试经历
  • 原文地址:https://www.cnblogs.com/YeChing/p/6361581.html
Copyright © 2011-2022 走看看