JavaScript学习-私有变量

本文介绍了JavaScript中私有变量的概念及其实现方式,包括通过函数作用域实现的简单私有变量、静态私有变量,以及利用模块模式创建单例对象的方法,并探讨了增强的模块模式。

1,简述

  • 任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数的外部访问这些变量,私有变量包括函数的参数,局部变量和在函数内部定义的其他函数。
  • 我们把有权访问私有变量和私有函数的公有方法称为特权方法,基本模式如下代码所示:

    function MyObject(){
        // 私有变量和私有函数
        var privateVariable = 10;
    
        function privateFunction(){
            return false;
        }
        // 特权方法
        this.publicMethod = function(){
            privateVariable++;
            return privateFunction();
        };
    }

2,静态私有变量

  • 在私有作用域中定义私有变量或函数,同样也可以创建特权方法,看下面的代码。

    (function(){
        var name = "";
        Person = function(value){
            name = value;
        };
        Person.prototype.getName = function(){
            return name;
        };
    
        Person.prototype.setName = function(value){
            name = value;
        };
    })();
    
    var person1 = newPerson("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"
  • 初始化未经声明的变量,总会创建一个全局变量,因此Person就成了全局变量,但是在严格模式下,给未经声明的变量赋值会导致错误。
  • 以这种方式创建静态私有变量会因为使用原型而增进代码复用,但每个实例都没有自己的私有变量,到底是使用实例变量,还是静态变量,最终还是要看具体需求而定。

3,模块模式

  • 介绍
    • 模块模式是为单例创建私有变量和特权方法。
    • 所谓单例,指的是只有一个实例的对象。
    • 按照惯例,JavaScript是以对象字面量的方式来创建单例对象的。
  • 代码说话

    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.oush(component);
                }
            }
        };
    }();
    • 这个模块模式使用了一个返回对象的匿名函数。这个匿名函数内部,首先定义了私有变量和函数。然后将一个对象字面量作为函数的值返回。
    • 返回的对象字面量中只包含可以公开的属性和方法。从本质上讲,这个对象字面量定义的是单例的公共接口。

4,增强的模块模式

  • 介绍
    这种增强的模块模式适合那些单例必须是某种类型的实例,同时还必须添加某些属性和方法对其加以增强的情况。
  • 代码示例:

    var singleton = function(){
        var prvateVariable = 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、付费专栏及课程。

余额充值