2018-12-06

7.4.1 静态私有变量

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

(function(){
    //私有变量和私有函数
    var privateVariable = 10;

    function privateFunction (){
        return false;
    }

    //构造函数
    MyObject = function(){
    };

    //公有/特权方法
    MyObject.prototype.publicMethod = function(){
        privateVariable++;
        return privateFunction();
    }
})();

这个模式创建了一个私有作用域,并在其中封装了一个构造函数及相应的方法。在私有作用域中,首先定义了私有变量和私有函数,然后又定义了构造函数及其公有方法。
公有方法是在原型上定义的,这一点体现了典型的原型模式。需要注意的是,这个模式在定义构造函数时并没有使用函数声明,而是使用了函数表达式。
函数声明只能创建局部函数
初始化未经声明的变量,总是会创建一个全局变量。
因此MyObject ()就成了一个全局变量,能够在私有作用域之外被访问到。但是在严格模式下给未经声明的变量赋值会导致错误。

这个模式与在构造函数中定义特权方法的主要区别,就在于私有变量和函数是由实例共享的。由于特权方法是在原型上定义的,因此所有实例都使用同一个函数。而这个特权方法,作为一个闭包,总是保存着对包含作用域的引用:

(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("kathy");
alert(person1.getName());//kathy
person1.setName("Payne");
alert(person1.getName());//Payne

var person2 = new Person("stephen");
alert(person1.getName());//stephen
alert(person2.getName());//stephen

这个例子中Person构造函数与getName()和setName()一样都有权访问变量name。在这种模式下,变量name就变成了一个静态的、由所有实例共享的属性。
也就是说,在一个实例上调用setName()会影响所有实例。
而调用setName()或新建一个Person实例都会赋予name属性一个新值。结果就是所有实例都会返回相同的值。

【自己领悟的笔记】

变量:var privateVariable = 10;
函数:
    function privateFunction (){
    }
在函数内部一般使用return function这种形式 形成闭包,然后生成私有变量。
如果对外不提供return function这个方法的话,外部函数就无法访问这个闭包里面的变量。
如果函数里面没有变量,就没有私有变量这一说。

私有变量是为了跟全局变量做区别。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  •   函数表达式是 JavaScript 中的一个既强大有容易令人困惑的特性。定义函数的的方式有两种: 函数声明; ...
    霜天晓阅读 4,276评论 0 1
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 10,744评论 0 21
  • 定义函数的方式有两种:函数声明和函数表达式。 函数声明的一个重要特征就是函数声明提升,意思是在执行代码前会先读取函...
    oWSQo阅读 3,933评论 0 0
  • 第一章 你是不是安全感的奴隶 “不是所有行为都值得喜欢,但是这个世界,却是所有人都可爱。” 作为不太会认路的人,始...
    115c3253903d阅读 3,627评论 0 2
  • 新一代标准已经提出有些日子了,最近在写react的时候,react用了大量的class的语法去写组件,对于clas...
    physihan阅读 5,346评论 0 0

友情链接更多精彩内容