標籤:style blog java color 使用 io
執行個體:使用物件導向思想處理cookie
如果讀者對cookie 不熟悉,可以在第七章學習它的使用方法,雖然在那裡建立了幾個
通用函數用於cookie 的處理,但這些函數彼此分離,沒有體現出是一個整體。聯想到
JavaScript中Math對象的功能,它其實就是通過Math這個全域對象,把所有的數學計算相
關的常量和方法都聯絡到一起,作為一個整體使用,提高了封裝性和使用效率。現在對cookie
的處理事實上也可以按照這種方法來進行。
6.9.1 需求分析
對於cookie 的處理,事實上只是封裝一些方法,每個對象不會有狀態,所以不需要創
建一個cookie 處理類,而只用一個全域對象來聯絡這些cookie 操作。對象名可以理解為命
名空間。下面考慮cookie操作有哪些經常的操作:
(1)設定cookie包括了添加和修改功能,事實上如果原有cookie名稱已經存在,那麼
添加此cookie 就相當於修改了此cookie。在設定cookie 的時候可能還會有一些可選項,用
於指定cookie 的聲明周期、訪問路徑以及訪問域。為了讓cookie 中能夠儲存中文,該方法
中還需要對儲存的值進行編碼。
(2)刪除一個cookie,刪除cookie只需將一個cookie的到期事件設定為過去的一個時
間即可,它接收一個cookie的名稱為參數,從而刪除此cookie。
(3)取一個cookie的值,該方法接收cookie名稱為參數,返回該cookie的值。因為在
儲存該值的時候已經進行了編碼,所以取值時應該能自動解碼,然後返回。
針對這些需求,下一小節將實現這些功能。
6.9.2 建立Cookie對象
因為是作為類名或者命名空間的作用,所以和Math對象類似,這裡使用Cookie來表示
該對象:
var Cookie=new Object();
6.9.3 實現設定Cookie的方法
方法原型為:setCookie(name,value,option);其中name 是要設定cookie的名稱;value是
設定cookie的值;option包括了其他選項,是一個對象作為參數。其實現如下:
Cookie.setCookie=function(name,value,option){
//用於儲存賦值給document.cookie的cookie格式字串
var str=name+"="+escape(value);
if(option){
//如果設定了到期時間
if(option.expireDays){
var date=new Date();
var ms=option.expireDays*24*3600*1000;
date.setTime(date.getTime()+ms);
str+="; expires="+date.toGMTString();
}
if(option.path)str+="; path="+path; //設定訪問路徑
if(option.domain)str+="; domain"+domain; //設定訪問主機
if(option.secure)str+="; true"; //設定安全性
}
document.cookie=str;
}
6.9.4 實現取Cookie 值的方法
方法原型為:getCookie(name);其中name 是指定cookie的名稱,從而根據名稱返回相應
的值。實現如下:
Cookie.getCookie=function(name){
var cookieArray=document.cookie.split("; "); //得到分割的cookie名值對
var cookie=new Object();
for(var i=0;i<cookieArray.length;i++){
var arr=cookieArray[i].split("="); //將名和值分開
if(arr[0]==name)return unescape(arr[1]); //如果是指定的cookie,則返回它的值
}
return "";
}
6.9.5 實現刪除Cookie的方法
方法原型為:deleteCookie(name);其中name 是指定cookie 的名稱,從而根據這個名稱
刪除相應的cookie。在本實現中,刪除cookie是通過調用setCookie來完成的,將option的
expireDays屬性指定為負數即可:
Cookie.deleteCookie=function(name){
this.setCookie(name,"",{expireDays:-1}); //將到期時間設定為過去來刪除一個cookie
}
通過上面的代碼,整個Cookie對象就建立完畢,也可以將其放到一個大括弧中來定義,
例如:
var Cookie={
setCookie:function(){},
getCookie:function(){},
deleteCookie:function(){}
}
通過這種形式,可以讓Cookie 的功能更加清晰,它作為一個全域對象,大大方便了對
Cookie的操作,例如:
Cookie.setCookie(“user”,”jack”);
alert(Cookie.getCookie(“user”));
Cookie.deleteCookie(“user”);
alert(Cookie.getCookie(“user”));
上面的代碼就先建立了一個名為user 的cookie,然後刪除了該cookie。兩次alert 輸出
語句顯示了執行的效果。
本節通過建立一個Cookie 對象來處理cookie,方便了操作,也體現了物件導向的編程
思想:把相關的功能封裝在一個對象中。考慮到JavaScript語言的特點,本章沒有選擇需要
建立類的物件導向編程的例子,那和一般物件導向語言沒有大的不同。而是以JavaScript中
可以直接建立對象為特點介紹了Cookie對象的實現及其工作原理。事實上這也和JavaScript
內部對象Math的工作原理是類似的。
var Cookie=new Object();Cookie={setCookie:function(name,value,option){//用於儲存賦值給document.cookie的cookie格式字串var str=name+"="+escape(value);if(option){//如果設定了到期時間if(option.expireDays){var date=new Date();var ms=option.expireDays*24*3600*1000;date.setTime(date.getTime()+ms);str+="; expires="+date.toGMTString();}if(option.path)str+="; path="+path; //設定訪問路徑if(option.domain)str+="; domain"+domain; //設定訪問主機if(option.secure)str+="; true"; //設定安全性}document.cookie=str;},getCookie:function(name){var cookieArray=document.cookie.split("; "); //得到分割的cookie名值對var cookie=new Object();for(var i=0;i<cookieArray.length;i++){var arr=cookieArray[i].split("="); //將名和值分開if(arr[0]==name){//如果是指定的cookie,則返回它的值return unescape(arr[1]); }}return "";},deleteCookie:function(name){this.setCookie(name,"",{expireDays:-1}); //將到期時間設定為過去來刪除一個cookie}}