2018-12-06

2018-12-06  本文已影响0人  kathyever

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这个方法的话,外部函数就无法访问这个闭包里面的变量。
如果函数里面没有变量,就没有私有变量这一说。

私有变量是为了跟全局变量做区别。
上一篇 下一篇

猜你喜欢

热点阅读