天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

JavaScript 對(duì)Cookie 操作的封裝小結(jié)

Javascript 沒(méi)有 private , public 訪問(wèn)權(quán)限設(shè)置的關(guān)鍵字,但是可以通過(guò)一定的技巧來(lái)模擬出相同的結(jié)果.
首先我們來(lái)看下面一行代碼:
var i = (1, 2, 3, 4, 5);
變量 i 最后的結(jié)果為 5.
這是逗號(hào)操作符的結(jié)果,也就是說(shuō)返回最后的一個(gè)值,小括號(hào)改變了這行代碼的優(yōu)先級(jí),否則 var i = 1, 2, 3, 4, 5; 會(huì)報(bào)錯(cuò)缺少標(biāo)識(shí)符.


var i = (1, 2, 3, 4, function(){ return 5 * 5;});
變量 i 最后的結(jié)果為 一個(gè)函數(shù), 返回結(jié)果 25.
這就是Javascript 的靈活之處,能夠賦值任意類(lèi)型而不必提前聲明.現(xiàn)在我們完全可以進(jìn)行如下調(diào)用:

i();
alert( i() );
來(lái)獲得返回25的一次方法調(diào)用.


我們繼續(xù), 變量 i 是通過(guò)賦值符來(lái)獲取函數(shù)的引用的, 也就是說(shuō)在等號(hào)右邊的小括號(hào)運(yùn)算完后返回的最后一個(gè)結(jié)果的引用還在,雖然我們無(wú)法顯示調(diào)用,但它確實(shí)存在,如果要不通過(guò)變量的引用而調(diào)用呢?

(1, 2, 3, 4, function(){ alert(5 * 5);})()
上面的代碼執(zhí)行后,彈出一個(gè)消息框,顯示25.
為了顯示方便,我將上個(gè)例子的函數(shù)改為彈出消息框了.
兩對(duì)小括號(hào) () (); 前面一對(duì)表示返回一個(gè)結(jié)果,如果該結(jié)果為一個(gè)函數(shù),由第二對(duì)小括號(hào)發(fā)生調(diào)用.
也就是通過(guò)前面一對(duì)括號(hào)發(fā)生匿名函數(shù)的引用,以便在下面進(jìn)行引用.這就是對(duì)匿名函數(shù)的調(diào)用.
關(guān)于更多匿名函數(shù)的使用可以參考文尾的引用連接.

閉包產(chǎn)生的原因是因?yàn)樽饔糜虻牟煌?子作用域引用了父作用域的變量,而返回子作用域,父作用域按理來(lái)說(shuō)執(zhí)行完畢后該銷(xiāo)毀掉了,只是子作用域一直存在,且一直握有父作用域的引用,所以才一直保留.
來(lái)看下面的代碼
復(fù)制代碼 代碼如下:
function parent() {
var a = 1;
function child(){
var b = 2;
alert(a);
alert(b);
}
}

父函數(shù) parent 中包含了一個(gè) child 子函數(shù),在子函數(shù)中有一個(gè)對(duì)父函數(shù)中 a 變量的引用(輸出其值).
我們來(lái)讓父函數(shù)執(zhí)行完后返回其聲明的子函數(shù)
復(fù)制代碼 代碼如下:
function parent() {
var a = 1;
function child(){
var b = 2;
alert(a);
alert(b);
}
return child;
}
var t = parent();
t();

在10行中, 我們執(zhí)行了parent 函數(shù),返回了在函數(shù)內(nèi)部聲明的函數(shù) child,這時(shí)變量 t 持有該返回對(duì)象(此時(shí)是一個(gè)可以執(zhí)行的函數(shù))的引用,在11行代碼中我們調(diào)用了它.結(jié)果分別輸出了 1 和 2.
注意,輸出 2, 是因?yàn)槲覀冊(cè)谧雍瘮?shù)體內(nèi)聲明了一個(gè)變量,而輸出 1, 我們?cè)谠摵瘮?shù)體內(nèi)并沒(méi)有相應(yīng)的定義變量 a ,而是發(fā)生了對(duì)父函數(shù)里的變量的引用,也就是說(shuō)引用了父作用域的變量.
而此時(shí)又能能夠完成輸出的,也就是說(shuō)變量 a 還存在.可是我們無(wú)法直接對(duì)其引用 (比如 parent.a),因?yàn)楹瘮?shù)已經(jīng)執(zhí)行完畢,沒(méi)有了其相應(yīng)的引用,我們只能通過(guò)所返回的子函數(shù)的引用來(lái)進(jìn)行訪問(wèn).
假如我又在父函數(shù)中聲明了其他的變量呢? 結(jié)果是一樣的,子函數(shù)能夠訪問(wèn),而如果子函數(shù)并不返回相應(yīng)的引用的話,我們根本無(wú)法從外部訪問(wèn)到.這就形成了閉包.

閉包能夠干些什么呢?如果你有一個(gè)不想讓外部隨意修改的變量該怎么做?那就去使用閉包.
復(fù)制代碼 代碼如下:
myObj = {}; //聲明一個(gè)全局變量,它是一個(gè)window對(duì)象的屬性(window.myObj)
(function(){
var i = 4;
myObj = { //引用全局變量,對(duì)其進(jìn)行賦值
getI : function() { //get方法,一個(gè)函數(shù)
return i;
},
setI : function(val) { //set方法,限制值的設(shè)定
if(val > 100) {
alert("i connt > 100");
return;
}
i = val;
}
}
})(); //匿名函數(shù)的調(diào)用,由于也是一個(gè)函數(shù),所以作為一個(gè)子作用域,在執(zhí)行完之后銷(xiāo)毀,避免代碼污染
myObj.setI(5); //成功
myObj.setI(101); //失敗
alert(myObj.getI());
alert(myObj.i); //錯(cuò)誤,沒(méi)有該屬性


至此我們簡(jiǎn)單的實(shí)現(xiàn)了public 訪問(wèn)權(quán)限以及 private 訪問(wèn)權(quán)限 (也就給你想給你的,不給你不想給你的)



在頁(yè)面中,我們通常使用 document.cookie 屬性來(lái)訪問(wèn),對(duì)其賦新值就會(huì)創(chuàng)建一個(gè)新的Cookie,一個(gè)Cookie通常具有五個(gè)屬性:value (存儲(chǔ)的值), date (UTC格式的時(shí)間,代表什么時(shí)間過(guò)期, domain (域,Cookie的所有者), Path (子目錄).
而在平常的開(kāi)發(fā)中,如果僅僅使用 document.cookie 屬性進(jìn)行訪問(wèn),會(huì)很麻煩,因?yàn)橹荒芟蚱滟x值字符串,并且在讀取后還要進(jìn)行字符串切割,才能獲取指定變量名稱(chēng)的值.document.cookie 讀取時(shí),返回的是所有賦值的值,而不包括過(guò)期時(shí)間,域之類(lèi)的信息,只能再次獨(dú)設(shè)置.
下面就附上代碼,全部封裝到Cookie全局對(duì)象中,暴露出幾個(gè)方法.
Get : 放回指定所有cookie字符串.
Set : 設(shè)置cookie 字符串.
Clear : 清除所有cookie對(duì)象.
GetDayTime : 獲取指定距今val天的Date對(duì)象.
Write : 寫(xiě)cookie.已重載.詳見(jiàn)代碼.
Query : 查詢(xún)cookie. 已重載.詳見(jiàn)代碼.
Update : 修改cookie.
Delete : 刪除cookie.


代碼1-7
復(fù)制代碼 代碼如下:
Cookie = {};
/*
* Date對(duì)象的setTime方法是設(shè)置距離1970-01-01以來(lái)的毫秒數(shù),設(shè)置到對(duì)象里去,返回的是據(jù)那以后的毫秒數(shù)而不是原對(duì)象.
* 如果Cookie 不設(shè)置 expires 屬性,或者expires 時(shí)間比本地時(shí)間少,那么將會(huì)在下一次瀏覽時(shí)過(guò)期.
* document.cookie 對(duì)象返回的是所有值的字符串形式,不包含 expires 或者其他.
*
*/
(function() {
var nDay = 24 * 60 * 60 * 1000;
var isString = function(v) {
return typeof v === "string";
}
var isArray = function(v) {
return Object.prototype.toString.apply(v) == "[object Array]";
}
var isObject = function(v) {
return v && typeof v == "object";
}
var isDate = function(v) {
return Object.prototype.toString.apply(v) == "[object Date]";
}
var getTime = function() {
return new Date().getTime();
}
var trim = function(val) {
return (val || "").replace(/^/s+|/s+$/g, "");
}
var tryEval = function(val) {
var Obj, e;
try {
Obj = eval(val);
} catch (e) {
Obj = val;
}
return Obj;
}
var ObjectToString = function(o) {
var tstr = "{";
for (var v in o) {
if (isArray(o[v])) {
tstr += v + ":" + ArrayToString(o[v]) + ",";
} else if (isObject(o[v])) {
tstr += v + ":" + ObjectToString(o[v]) + ",";
} else if (isString(o[v])) {
tstr += v + ":/"" + o[v].toString() + "/",";
} else {
tstr += v + ":" + o[v].toString() + ",";
}
}
return tstr.slice(0, -1) + "}";
}
var ArrayToString = function(o) {
var tstr = "[";
for (var v in o) {
if (isArray(o[v])) {
tstr += ArrayToString(o[v]) + ",";
} else if (isObject(o[v])) {
tstr += ObjectToString(o[v]) + ",";
} else {
tstr += o[v].toString() + ",";
}
}
return tstr.slice(0, -1) + "]"; ;
}
Cookie = {
Get: function() {
return document.cookie;
},
Set: function(val) {
document.cookie = val;
},
Clear: function() {
var temp = this.Query();
var o;
for (o in temp) {
this.Delete(o);
}
},
GetDayTime: function(val) {
var texpires = new Date();
texpires.setTime(texpires.getTime() + val * nDay);
return texpires;
},
Write: function() {
/*
* Cookie.Write(Object); 寫(xiě)入對(duì)象,名稱(chēng)為main;
* Cookie.Write(varname, Object); varname:變量名, Object:寫(xiě)入對(duì)象;
* Cookie.Write(Object, Date); Object:寫(xiě)入對(duì)象, Date:過(guò)期時(shí)間;
* Cookie.Write(varname, Object, Date); varname:變量名, Object:寫(xiě)入對(duì)象, Date:過(guò)期時(shí)間;
* Cookie.Write(varname, Object, Date, Domain, Path); varname:變量名, Object:寫(xiě)入對(duì)象, Date:過(guò)期時(shí)間, Domain:域, Path: 子目錄;
*/
if (arguments.length == 1) {
var tvalue = arguments[0];
var tstr = "";
var texpires = new Date(); texpires.setTime(texpires.getTime() + 1 * nDay);
if (isArray(tvalue)) {
tstr = ArrayToString(tvalue);
} else if (isObject(tvalue)) {
tstr = ObjectToString(tvalue);
} else {
tstr = tvalue.toString();
}
tstr = "main=" + escape(tstr) + ";expires=" + texpires.toGMTString() + ";";
} else if (arguments.length == 2) {
var tname, tvalue, texpires, tstr = "";
if (isDate(arguments[1])) {
tname = "main";
tvalue = arguments[0];
texpires = arguments[1];
} else {
tname = arguments[0];
tvalue = arguments[1];
texpires = new Date(); texpires.setTime(texpires.getTime() + 1 * nDay);
}
if (isArray(tvalue)) {
tstr += ArrayToString(tvalue);
} else if (isObject(tvalue)) {
tstr += ObjectToString(tvalue);
} else {
tstr = tvalue.toString();
}
tstr = tname + "=" + escape(tvalue) + ";expires=" + texpires.toGMTString() + ";";
} else if (arguments.length == 3) {
var tname = arguments[0], tvalue = arguments[1], texpires = arguments[2], tstr = "";
if (isArray(tvalue)) {
tstr = ArrayToString(tvalue);
} else if (isObject(tvalue)) {
tstr = ObjectToString(tvalue);
} else {
tstr = tvalue.toString();
}
tstr = tname + "=" + escape(tvalue) + ";expires=" + texpires.toGMTString() + ";";
} else if (arguments.length == 5) {
var tname = arguments[0], tvalue = arguments[1], texpires = arguments[2], tdomain = arguments[3], tpath = arguments[4], tstr = "";
if (isArray(tvalue)) {
tstr = ArrayToString(tvalue);
} else if (isObject(tvalue)) {
tstr = ObjectToString(tvalue);
} else {
tstr = tvalue.toString();
}
tstr = tname + "=" + escape(tvalue) + ";expires=" + texpires.toGMTString() + ";domain=" + tdomain + ";path=" + tpath + ";";
}
alert(tstr);
this.Set(tstr);
},
Query: function() {
/*
* Cookie.Query(); 返回所有Cookie值組成的Object;
* Cookie.Query(string); 返回指定名稱(chēng)的Object; 失敗則返回 undefined;
* Cookie.Query(string, Object); 為指定對(duì)象寫(xiě)入指定名稱(chēng)的Object,并返回; 失敗則返回 undefined;
*/
var tname = tvalue = "", tright = -1;
var tstr = this.Get();
var tObj = {};
if (arguments.length == 0) {
var i = 0;
do {
tname = trim(tstr.slice(i, tstr.indexOf("=", i)));
tright = tstr.indexOf(";", i);
if (tright == -1) {
tvalue = unescape(tstr.slice(tstr.indexOf("=", i) + 1, tstr.length));
} else {
tvalue = unescape(tstr.slice(tstr.indexOf("=", i) + 1, tright));
}
tObj[tname] = tryEval(tvalue);
i = tstr.indexOf(";", i) == -1 ? -1 : tstr.indexOf(";", i) + 1;
} while (i != -1);
} else {
tname = arguments[0];
if (tstr.indexOf(tname) == -1) return undefined;
var i = tstr.indexOf(tname);
tname = trim(tstr.slice(i, tstr.indexOf("=", i)));
tright = tstr.indexOf(";", tstr.indexOf(tname)) == -1 ? tstr.length : tstr.indexOf(";", tstr.indexOf(tname));
tvalue = unescape(tstr.slice(tstr.indexOf(tname) + tname.length + 1, tright));
if (arguments.length == 1) {
tObj = tryEval(tvalue);
} else if (arguments.length == 2) {
tObj = arguments[1];
tObj[tname] = tryEval(tvalue);
}
}
return tObj;
},
Update: function() {
return this.Write.apply(this, arguments);
},
Delete: function() {
if (arguments.length == 1) {
var varname = arguments[0];
if (this.Query(varname)) {
this.Update(varname, "", new Date(1970, 01, 01));
}
}
}
}


其中有一個(gè)從字符串eval 成對(duì)象的執(zhí)行,以及從Object 或者 Array 對(duì)象獲得對(duì)應(yīng)字符串形式的功能函數(shù),模擬了一些JSON的操作.當(dāng)然,并不能存儲(chǔ)所有的JavaScript 對(duì)象,僅僅滿(mǎn)足一部分,我已經(jīng)感覺(jué)夠用了.


個(gè)人理解有限,請(qǐng)各位多多指教.
Javascript的匿名函數(shù) : 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

JavaScript技術(shù)JavaScript 對(duì)Cookie 操作的封裝小結(jié),轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 日本九九热在线观看官网 | 中国农村真实bbwbbwbbw | 加勒比一本之道高清视频在线观看 | 秋霞电影网午夜免费鲁丝片 | 女人被躁到高潮嗷嗷叫69 | 色噜噜狠狠一区二区三区 | 成人免费视频在线看 | 538prom精品视频我们不只是 | 亚洲狠狠网站色噜噜 | 国产精品人妻无码99999 | 久久网站视频 | 亚洲精品一区国产欧美 | 国产乱码卡二卡三卡4W | 伊人激情综合网 | 人性本色联盟 | 达达兔欧美午夜国产亚洲 | 欧美日韩一二区旡码高清在线 | 白丝美女被狂躁免费漫画 | 91国偷自产一区二区三区 | 俄罗斯乌克兰战争原因 | 亚洲国产在线综合018 | 恋夜秀场支持安卓版全部视频国产 | 肉肉的各种姿势高H细文 | 91热久久免费频精品99欧美 | 亚洲AV中文字幕无码久久 | 男女一边摸一边做羞羞的事情免费 | 亚洲伊人久久网 | 国产精品成久久久久三级四虎 | 亚洲中文无码永久免费 | 日本精品久久久久中文字幕 | 国产精品无码中文在线AV | 日韩1区1区产品乱码芒果榴莲 | 伊人青青草 | 51精品少妇人妻AV一区二区 | 美女动态图真人后进式 | 视频一区国产 | 亚洲精品不卡视频 | 无码天堂亚洲国产AV久久 | www免费看.男人的天堂 | 99热这里只有精品 | 国产精品久久久久久久久LI无码 |