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这个方法的话,外部函数就无法访问这个闭包里面的变量。
如果函数里面没有变量,就没有私有变量这一说。
私有变量是为了跟全局变量做区别。
网友评论