使用JavaScript 对Cookie 操作的封装

通过本篇,您能了解到:

  • 匿名函数
  • 闭包的产生
  • JavaScript实现private 以及 public 访问权限
  • document.cookie 的操作


    Javascript 没有 private , public 访问权限设置的关键字,但是可以通过一定的技巧来模拟出相同的结果.
    首先我们来看下面一行代码:

var  i  =  ( 1 2 3 4 5 );

    变量 i 最后的结果为 5.
    这是逗号操作符的结果,也就是说返回最后的一个值,小括号改变了这行代码的优先级,否则 var i = 1, 2, 3, 4, 5; 会报错缺少标识符.

 

var  i  =  ( 1 2 3 4 function (){     return   5   *   5 ;});

    变量 i 最后的结果为 一个函数, 返回结果 25.
    这就是Javascript 的灵活之处,能够赋值任意类型而不必提前声明.现在我们完全可以进行如下调用:

i();
alert( i() );

    来获得返回25的一次方法调用.

 

    我们继续, 变量 i 是通过赋值符来获取函数的引用的, 也就是说在等号右边的小括号运算完后返回的最后一个结果的引用还在,虽然我们无法显示调用,但它确实存在,如果要不通过变量的引用而调用呢?

 

( 1 2 3 4 function (){    alert( 5   *   5 );})()

    上面的代码执行后,弹出一个消息框,显示25.
    为了显示方便,我将上个例子的函数改为弹出消息框了.
    两对小括号 () (); 前面一对表示返回一个结果,如果该结果为一个函数,由第二对小括号发生调用.
    也就是通过前面一对括号发生匿名函数的引用,以便在下面进行引用.这就是对匿名函数的调用.
    关于更多匿名函数的使用可以参考文尾的引用连接.

 

    闭包产生的原因是因为作用域的不同,子作用域引用了父作用域的变量,而返回子作用域,父作用域按理来说执行完毕后该销毁掉了,只是子作用域一直存在,且一直握有父作用域的引用,所以才一直保留.
    来看下面的代码

1  function  parent() {
2       var  a  =   1 ;
3       function  child(){
4           var  b  =   2 ;
5          alert(a);
6          alert(b);
7      }
8  }

    父函数 parent 中包含了一个 child 子函数,在子函数中有一个对父函数中 a 变量的引用(输出其值).
    我们来让父函数执行完后返回其声明的子函数

 1  function  parent() {
 2       var  a  =   1 ;
 3       function  child(){
 4           var  b  =   2 ;
 5          alert(a);
 6          alert(b);
 7      }
 8       return  child;
 9  }
10  var  t  =  parent();
11  t();

    在10行中, 我们执行了parent 函数,返回了在函数内部声明的函数 child,这时变量 t 持有该返回对象(此时是一个可以执行的函数)的引用,在11行代码中我们调用了它.结果分别输出了 1 和 2.
    注意,输出 2, 是因为我们在子函数体内声明了一个变量,而输出 1, 我们在该函数体内并没有相应的定义变量 a ,而是发生了对父函数里的变量的引用,也就是说引用了父作用域的变量.
    而此时又能能够完成输出的,也就是说变量 a 还存在.可是我们无法直接对其引用 (比如 parent.a),因为函数已经执行完毕,没有了其相应的引用,我们只能通过所返回的子函数的引用来进行访问.
    假如我又在父函数中声明了其他的变量呢? 结果是一样的,子函数能够访问,而如果子函数并不返回相应的引用的话,我们根本无法从外部访问到.这就形成了闭包.

 

    闭包能够干些什么呢?如果你有一个不想让外部随意修改的变量该怎么做?那就去使用闭包.

 

 1  myObj  =  {};    // 声明一个全局变量,它是一个window对象的属性(window.myObj)
 2  ( function (){
 3       var  i  =   4 ;
 4      myObj  =  {     // 引用全局变量,对其进行赋值
 5          getI :  function () {     // get方法,一个函数
 6               return  i;
 7          },
 8          setI :  function (val) {     // set方法,限制值的设定
 9               if (val  >   100 ) {
10                  alert( " i connt > 100 " );
11                   return ;
12              }
13              i  =  val;
14          }
15      }
16  })();     // 匿名函数的调用,由于也是一个函数,所以作为一个子作用域,在执行完之后销毁,避免代码污染
17  myObj.setI( 5 );   // 成功
18  myObj.setI( 101 );   // 失败
19  alert(myObj.getI());
20  alert(myObj.i);   // 错误,没有该属性


    至此我们简单的实现了public 访问权限以及 private 访问权限 (也就给你想给你的,不给你不想给你的) 

 

 

    在页面中,我们通常使用 document.cookie 属性来访问,对其赋新值就会创建一个新的Cookie,一个Cookie通常具有五个属性:value (存储的值), date (UTC格式的时间,代表什么时间过期, domain (域,Cookie的所有者), Path (子目录).

    而在平常的开发中,如果仅仅使用 document.cookie 属性进行访问,会很麻烦,因为只能向其赋值字符串,并且在读取后还要进行字符串切割,才能获取指定变量名称的值.document.cookie 读取时,返回的是所有赋值的值,而不包括过期时间,域之类的信息,只能再次独设置.

    下面就附上代码,全部封装到Cookie全局对象中,暴露出几个方法.

    Get : 返回指定所有cookie字符串.
    Set : 设置cookie 字符串.
    Clear : 清除所有cookie对象.
    GetDayTime : 获取指定距今val天的Date对象.
    Write : 写cookie.已重载.详见代码.
    Query : 查询cookie. 已重载.详见代码.
    Update : 修改cookie.
    Delete : 删除cookie.

 

ExpandedBlockStart.gif 代码1-7
  1  Cookie  =  {};
  2  /*
  3  *       Date对象的setTime方法是设置距离1970-01-01以来的毫秒数,设置到对象里去,返回的是据那以后的毫秒数而不是原对象.
  4  *       如果Cookie 不设置 expires 属性,或者expires 时间比本地时间少,那么将会在下一次浏览时过期.
  5  *       document.cookie 对象返回的是所有值的字符串形式,不包含 expires 或者其他.
  6  *
  7  */
  8  ( function () {
  9       var  nDay  =   24   *   60   *   60   *   1000 ;
 10       var  isString  =   function (v) {
 11           return   typeof  v  ===   " string " ;
 12      }
 13       var  isArray  =   function (v) {
 14           return  Object.prototype.toString.apply(v)  ==   " [object Array] " ;
 15      }
 16       var  isObject  =   function (v) {
 17           return  v  &&   typeof  v  ==   " object " ;
 18      }
 19       var  isDate  =   function (v) {
 20           return  Object.prototype.toString.apply(v)  ==   " [object Date] " ;
 21      }
 22       var  getTime  =   function () {
 23           return   new  Date().getTime();
 24      }
 25       var  trim  =   function (val) {
 26           return  (val  ||   "" ).replace( / ^\s+|\s+$ / g,  "" );
 27      }
 28       var  tryEval  =   function (val) {
 29           var  Obj, e;
 30           try  {
 31              Obj  =  eval(val);
 32          }  catch  (e) {
 33              Obj  =  val;
 34          }
 35           return  Obj;
 36      }
 37       var  ObjectToString  =   function (o) {
 38           var  tstr  =   " { " ;
 39           for  ( var  v  in  o) {
 40               if  (isArray(o[v])) {
 41                  tstr  +=  v  +   " : "   +  ArrayToString(o[v])  +   " , " ;
 42              }  else   if  (isObject(o[v])) {
 43                  tstr  +=  v  +   " : "   +  ObjectToString(o[v])  +   " , " ;
 44              }  else   if  (isString(o[v])) {
 45                  tstr  +=  v  +   " :\ ""  + o[v].toString() +  " \ " , " ;
 46              }  else  {
 47                  tstr  +=  v  +   " : "   +  o[v].toString()  +   " , " ;
 48              }
 49          }
 50           return  tstr.slice( 0 - 1 +   " } " ;
 51      }
 52       var  ArrayToString  =   function (o) {
 53           var  tstr  =   " [ " ;
 54           for  ( var  v  in  o) {
 55               if  (isArray(o[v])) {
 56                  tstr  +=  ArrayToString(o[v])  +   " , " ;
 57              }  else   if  (isObject(o[v])) {
 58                  tstr  +=  ObjectToString(o[v])  +   " , " ;
 59              }  else  {
 60                  tstr  +=  o[v].toString()  +   " , " ;
 61              }
 62          }
 63           return  tstr.slice( 0 - 1 +   " ] " ; ;
 64      }
 65      Cookie  =  {
 66          Get:  function () {
 67               return  document.cookie;
 68          },
 69          Set:  function (val) {
 70              document.cookie  =  val;
 71          },
 72          Clear:  function () {
 73               var  temp  =   this .Query();
 74               var  o;
 75               for  (o  in  temp) {
 76                   this .Delete(o);
 77              }
 78          },
 79          GetDayTime:  function (val) {
 80               var  texpires  =   new  Date();
 81              texpires.setTime(texpires.getTime()  +  val  *  nDay);
 82               return  texpires;
 83          },
 84          Write:  function () {
 85               /*
 86              *   Cookie.Write(Object); 写入对象,名称为main;
 87              *   Cookie.Write(varname, Object); varname:变量名, Object:写入对象;
 88              *   Cookie.Write(Object, Date); Object:写入对象, Date:过期时间;
 89              *   Cookie.Write(varname, Object, Date); varname:变量名, Object:写入对象, Date:过期时间;
 90              *   Cookie.Write(varname, Object, Date, Domain, Path); varname:变量名, Object:写入对象, Date:过期时间, Domain:域, Path: 子目录;
 91               */
 92               if  (arguments.length  ==   1 ) {
 93                   var  tvalue  =  arguments[ 0 ];
 94                   var  tstr  =   "" ;
 95                   var  texpires  =   new  Date(); texpires.setTime(texpires.getTime()  +   1   *  nDay);
 96                   if  (isArray(tvalue)) {
 97                      tstr  =  ArrayToString(tvalue);
 98                  }  else   if  (isObject(tvalue)) {
 99                      tstr  =  ObjectToString(tvalue);
100                  }  else  {
101                      tstr  =  tvalue.toString();
102                  }
103                  tstr  =   " main= "   +  escape(tstr)  +   " ;expires= "   +  texpires.toGMTString()  +   " ; " ;
104              }  else   if  (arguments.length  ==   2 ) {
105                   var  tname, tvalue, texpires, tstr  =   "" ;
106                   if  (isDate(arguments[ 1 ])) {
107                      tname  =   " main " ;
108                      tvalue  =  arguments[ 0 ];
109                      texpires  =  arguments[ 1 ];
110                  }  else  {
111                      tname  =  arguments[ 0 ];
112                      tvalue  =  arguments[ 1 ];
113                      texpires  =   new  Date(); texpires.setTime(texpires.getTime()  +   1   *  nDay);
114                  }
115 
116                   if  (isArray(tvalue)) {
117                      tstr  +=  ArrayToString(tvalue);
118                  }  else   if  (isObject(tvalue)) {
119                      tstr  +=  ObjectToString(tvalue);
120                  }  else  {
121                      tstr  =  tvalue.toString();
122                  }
123                  tstr  =  tname  +   " = "   +  escape(tvalue)  +   " ;expires= "   +  texpires.toGMTString()  +   " ; " ;
124 
125              }  else   if  (arguments.length  ==   3 ) {
126                   var  tname  =  arguments[ 0 ], tvalue  =  arguments[ 1 ], texpires  =  arguments[ 2 ], tstr  =   "" ;
127                   if  (isArray(tvalue)) {
128                      tstr  =  ArrayToString(tvalue);
129                  }  else   if  (isObject(tvalue)) {
130                      tstr  =  ObjectToString(tvalue);
131                  }  else  {
132                      tstr  =  tvalue.toString();
133                  }
134                  tstr  =  tname  +   " = "   +  escape(tvalue)  +   " ;expires= "   +  texpires.toGMTString()  +   " ; " ;
135              }  else   if  (arguments.length  ==   5 ) {
136                   var  tname  =  arguments[ 0 ], tvalue  =  arguments[ 1 ], texpires  =  arguments[ 2 ], tdomain  =  arguments[ 3 ], tpath  =  arguments[ 4 ], tstr  =   "" ;
137                   if  (isArray(tvalue)) {
138                      tstr  =  ArrayToString(tvalue);
139                  }  else   if  (isObject(tvalue)) {
140                      tstr  =  ObjectToString(tvalue);
141                  }  else  {
142                      tstr  =  tvalue.toString();
143                  }
144                  tstr  =  tname  +   " = "   +  escape(tvalue)  +   " ;expires= "   +  texpires.toGMTString()  +   " ;domain= "   +  tdomain  +   " ;path= "   +  tpath  +   " ; " ;
145              }
146              alert(tstr);
147               this .Set(tstr);
148          },
149          Query:  function () {
150               /*
151              *   Cookie.Query(); 返回所有Cookie值组成的Object;
152              *   Cookie.Query(string); 返回指定名称的Object; 失败则返回 undefined;
153              *   Cookie.Query(string, Object); 为指定对象写入指定名称的Object,并返回; 失败则返回 undefined;
154               */
155               var  tname  =  tvalue  =   "" , tright  =   - 1 ;
156               var  tstr  =   this .Get();
157               var  tObj  =  {};
158               if  (arguments.length  ==   0 ) {
159                   var  i  =   0 ;
160                   do  {
161                      tname  =  trim(tstr.slice(i, tstr.indexOf( " = " , i)));
162                      tright  =  tstr.indexOf( " ; " , i);
163                       if  (tright  ==   - 1 ) {
164                          tvalue  =  unescape(tstr.slice(tstr.indexOf( " = " , i)  +   1 , tstr.length));
165                      }  else  {
166                          tvalue  =  unescape(tstr.slice(tstr.indexOf( " = " , i)  +   1 , tright));
167                      }
168                      tObj[tname]  =  tryEval(tvalue);
169                      i  =  tstr.indexOf( " ; " , i)  ==   - 1   ?   - 1  : tstr.indexOf( " ; " , i)  +   1 ;
170                  }  while  (i  !=   - 1 );
171 
172              }  else  {
173                  tname  =  arguments[ 0 ];
174                   if  (tstr.indexOf(tname)  ==   - 1 return  undefined;
175                   var  i  =  tstr.indexOf(tname);
176                  tname  =  trim(tstr.slice(i, tstr.indexOf( " = " , i)));
177                  tright  =  tstr.indexOf( " ; " , tstr.indexOf(tname))  ==   - 1   ?  tstr.length : tstr.indexOf( " ; " , tstr.indexOf(tname));
178                  tvalue  =  unescape(tstr.slice(tstr.indexOf(tname)  +  tname.length  +   1 , tright));
179 
180                   if  (arguments.length  ==   1 ) {
181                      tObj  =  tryEval(tvalue);
182                  }  else   if  (arguments.length  ==   2 ) {
183                      tObj  =  arguments[ 1 ];
184                      tObj[tname]  =  tryEval(tvalue);
185                  }
186              }
187               return  tObj;
188          },
189          Update:  function () {
190               return   this .Write.apply( this , arguments);
191          },
192          Delete:  function () {
193               if  (arguments.length  ==   1 ) {
194                   var  varname  =  arguments[ 0 ];
195                   if  ( this .Query(varname)) {
196                       this .Update(varname,  "" new  Date( 1970 01 01 ));
197                  }
198              }
199          }
200      }
201 


     其中有一个从字符串eval 成对象的执行,以及从Object 或者 Array 对象获得对应字符串形式的功能函数,模拟了一些JSON的操作.当然,并不能存储所有的JavaScript 对象,仅仅满足一部分,我已经感觉够用了.

 

    个人理解有限,请各位多多指教.

     源代码下载 : Cookie.js.zip

 

Javascript的匿名函数 : http://dancewithnet.com/2008/05/07/javascript-anonymous-function/
Javascript的闭包 : http://www.cn-cuckoo.com/wordpress/wp-content/uploads/2007/08/JavaScriptClosures.html
Cookie 文件的格式 : http://www.cnblogs.com/sephil/archive/2008/05/06/cookiefmt.html

 

转载于:https://www.cnblogs.com/dreampuf/archive/2009/12/30/JavaScript_CookieClass.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值