cookie自封装对象

cookie.js(设置名值对属性时候不支持设置成前后有空格的格式,如' key'或'key ',只支持‘key’)

(function initCookieClass(win){// 定义匿名函数并在定以后立即调用(function(){}()),圆括号保证并正确解析成函数
    var Cookie=function Cookie(maxage,path){// Cookie构造函数
        // 私有属性,将document.cookie解析成JSON对象
        var cookie=(function(ck){
            var cookie={};
            var all=ck;
            if(all==='') return cookie; // 返回空值对象
            // document.cookie以key1=value1;key2=value2的格式存储数据
            var list=all.split(';');    
            for (var i = 0; i < list.length; i++) {
                var c=list[i];
                var p=c.indexOf('=');
                var name=c.substring(0,p);
                // cookie存储中第一个名值对没有空格,第二个开始都有空格,做清除空格操作
                if(name && typeof name==='string') name=name.replace(/^s|s%/,'');
                var value=c.substring(p+1);
                // 对名值对进行解码,一般只要对值进行编解码,主要是对中文的处理
                name=decodeURIComponent(name);
                value=decodeURIComponent(value);
                cookie[name]=value;
            }
            return cookie;
        }(win.document.cookie));
        // 私有属性,keysSet
        var keys=[];
        for(var key in cookie) keys.push(key);
        // 自有属性,length表示cookie的对象数
        this.length=keys.length;
        // 实例方法,根据索引值返回cookie值,在根据长度遍历时候使用
        this.key=function(n){
            if(n<0||n>keys.length) return null;
            return cookie[n];
        };
        // 实例方法,根据key获取value
        this.getItem=function(name){
            return cookie[name]||null;
        };
        // 实例方法,设置cookie属性,以名值对的格式
        this.setItem=function(key,value){
            if(!key) {
                for(var k in value) {
                    this.setItem(k, value[k]);
                }
                return;
            }
            if(!(key in cookie)) {
                keys.push(key);
                this.length++;
            }
            cookie[key]=value;
            var c=encodeURIComponent(key)+'='+encodeURIComponent(value);
            if(maxage) c+=';max-age='+maxage;
            if(path) c+=';path='+path;
            win.document.cookie=c;
            return this;
        };
        // 实例方法,根据key删除value
        this.removeItem=function(key){
            if(!(key in cookie)) return;
            delete cookie[key];
            for (var i = 0; i < keys.length; i++) {
                if(keys[i]===key) {
                    keys.splice(i,1);
                    break;
                }
            }
            this.length--;
            win.document.cookie=encodeURIComponent(key)+'=;max-age=0';
            return this;
        };
        // 实例方法,清除掉cookie数据和此对象数据
        this.clear=function(){
            for (var i = 0; i < keys.length; i++) {
                win.document.cookie=encodeURIComponent(keys[i])+'=;max-age=0';
            }
            cookie={};
            keys=[];
            this.length=0;
            return this;
        };
        // 实例方法,重新从浏览器中获取cookie数据
        this.sync=function(){
            cookie=(function(){
                var cookie={};
                var all=win.document.cookie;
                if(all==='') return cookie;
                var list=all.split(';');
                for (var i = 0; i < list.length; i++) {
                    var c=list[i];
                    var p=c.indexOf('=');
                    var name=c.substring(0,p);
                    if(name && typeof name==='string') name=name.replace(/^s|s%/,'');
                    if(name) name=name.replace(/^s|s%/,'');
                    var value=c.substring(p+1);
                    name=decodeURIComponent(name);
                    value=decodeURIComponent(value);
                    cookie[name]=value;
                }
                return cookie;
            }());
            keys=[];
            for(var key in cookie) keys.push(key);
            this.length=keys.length;
            return this;
        };
        // 实例方法,返回cookie的JSON格式
        // 因为cookie是私有属性,在函数体闭包内用val声明的变量,在函数体外是无法直接访问的
        this.getCookieJSON=function(){
            return cookie;
        };
    };
    win.Cookie=Cookie;
    win.cookie=new Cookie();
}(window));

cookie.html,简单测试一下

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cookie Test</title>
<script type="text/javascript" src="cookie.js"></script>
<script type="text/javascript">
    (function(w){
        w.onload=function(){
            if(cookie) {
                // 增,改
                cookie.setItem('test','success');
                //
                var result=cookie.getItem('test');
                console.log('test:'+result);
                //
                cookie.removeItem('test');
                // 支持JSON格式的存储方案
                cookie.setItem(null,{'one':1,'two':2});
                // 根据JSON格式查找
                result=cookie.getCookieJSON();
                console.log('cookie for json:');
                for(var i in result) {
                    console.log('
'+i+':'+result[i]);
                }
            } else {
                throw new Error('Create cookie instance failure.');
            }
        };
    }(window));
</script>
</head>
<body>
    
</body>
</html>

默认cookie对象的生命周期是Web浏览器的会话期(session),与sessionStorage的作用域不同,cookie是整个浏览器进程,而不是单个窗口的进程。不同标签页可以共用,除非显示设置。

几乎所有的浏览器都支持cookie。

参考文献:《JavaScript权威指南》  --O‘REILLY[第六版]