一 私有变量
什么是私有变量:任何函数内部定义的变量都可以认为是函数的私有变量,因为不能从函数外部访问这些变量,私有变量包括
函数的参数,局部变量,函数内部定义的函数
function (num1,num2){
var sum=num1+num2
}
在这个函数内部有三个私有变量分别是num1,num2,sum在函数内部可以访问这三个变量,但是在函数外部不可以访问他们,
如果在函数内部创建一个闭包,闭包过自己的作用域链也可以访问这三个变量,利用这一点我们可以创建方法用来访问函数的私有变量
我们把有权访问私有变量和私有函数的方法叫做特权方法
在对象上创建特权方法的方法
一 在构造函数上创建特权方法:
function MyObject(){
//私有变量和私有函数
var privateVariable=10;
function privateFunction(){
return false;
}
//特权方法
this.publicMethod=function(){
privateVariable++;
return privateFunction();
};
}
这个构造模式在函数内部定义了私有变量和私有方法,如果没有特权方法(闭包函数),函数外部是无法访问函数内部的私有变量和方法的,然后我们在构造函数内部定义了特权方法,利用闭包函数的作用域链可以访问私有变量和私有方法,下面举个实际的例子;
function Person(name){
this.getName=function(){
return name;
};
this.setName=function(value){
name=value;
};
}
var person=new Person("Nike");
alert(person.getName());
person.setName("me");
alert(person.getName());
利用这种方法:构造函数创建的特权方法(闭包)是有问题的,那就是构造函数一直有的问题,你每根据构造函数创建一个新的示例都会新创建一个特权方法但是方法都是一样的所以浪费内存
而通过静态私有变量来常见特权方法的方法可以避免上面的问题
二 静态私有变量创建特权方法
(function(){
//私有变量和私有函数
var privateVariable=10;
function privateFunction(){
return false;
}
//构造函数的
MyObject=function(){};
//公有、特权方法
MyObject.prototype.publicMethod=function(){
privateVariable++;
return privateFunction();
};
})();
这个模式创建了一个私有作用域,然后在作用域内创建了变量方法和构造函数和相应的特权方法,特权方法说是在原型是定义的
这个模式在定义函数的时候并没有使用函数声明而是使用了函数表达式,因为函数声明只能创建局部函数,而函数表达式能创建全局函数,同样在创建对象的时候我们也没有使用var因为var在函数内部只能创建局部变量,初始化未经声明的变量会得到全局变量,在这里我们希望获得全局变量,这样对象就能在私有作用域之外的地方被访问到。
这个构造模式与构造函数构造特权方法的区别在于他的特权方法是在原型的(prototype)创建的,这样所有的实例都共享一个方法,而这个方法作为闭包,总是包含着对包含作用域的引用
(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("Niike");
alert(person1.getName());
person1.setName("kobe");
alert(person1.getName());
var person2=new Person("haha");
alert(person1.getName());
alert(person2.getName());
这个例子里面的person构造函数和setname和getName 一样都能够访问变量name这样的话变量name就变成了一个静态的有所有实例共享的变量,不管是你新建一个实例传入参数还是调用setname
新传入个名字都会改变变量的值
以上两个方法都是为自定义类型创建私有变和特权方法还有为单个实例创建特权方法的办法---模块模式