封装一个 cookie 功能

本文深入讲解了cookie在JavaScript中的应用,包括其基本概念、如何利用document.cookie进行操作,以及如何封装一个实用的cookie模块,以简化cookie的设置与读取过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述


阅读原文


cookie 概述

由于浏览器无状态的特性,cookie 技术应运而生,cookie 是一个会话级的存储,用于某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密),通过访问某些服务器而特定携带的存储信息,不支持跨域,在浏览器清空缓存或超过有效期后失效。


JavaScript 中的 cookie

在 JavaScript 中操作 cookie 通过 document.cookie 来实现:

// 操作 cookie
document.cookie = "key1=value1; key2=value2; path=/; domain=pandashen.com";

在传递 cookie 过程中,使用上面这样的方式对于参数的传递和拼接都是不太方便的,下面我们来封装一个自己的 cookie 功能。


封装一个 cookie 模块

1、整体思路设计

(function() {
    var kvTool = {
        maxage: "max-age",
        path: "path",
        domain: "domain",
        secure: "secure"
    };

    function setCookie() {}

    function getCookie() {}

    var cookieUtil = function() {};

    window.cookieUtil = cookieUtil;
})();

我们封装了一个自执行函数,在内部将 cookie 基本参数的键名存入 kvTool 对象当中设计的 options 参数的键名一一对应,并单独声明一个设置 cookie 的方法 setCookie 和获取 cookie 的方法 getCookie,最后用函数表达式的形式声明一个 cookieUtil 暴露给全局作用域。

2、setCookie 方法的实现

(function() {
    var kvTool = {
        maxage: "max-age",
        path: "path",
        domain: "domain",
        secure: "secure"
    };

    function setCookie(k, v, options) {
        if (!options) {
            document.cookie = k + "=" + v;
        } else {
            var tmp = [];
            for (var key in options) {
                // { path='/', domain='pandashen.com' }
                tmp.push(kvTool[key] + "=" + options[key]);
            }
            document.cookie = k + "=" + v + "; " + tmp.join("; ");
        }
    }

    function getCookie() {}

    var cookieUtil = function() {};

    window.cookieUtil = cookieUtil;
})();

setCookie 方法的有三个参数:

  • k:cookie 发送信息的键
  • v:cookie 发送信息的值
  • options:cookie 的基本参数

当没有传入基本参数 options 的时候直接将 cookie 发送信息的键值拼接赋值给 document.cookie

传入基本参数 options 的时候取出 kvTool 真正的键名,并和 cookie 发送的信息的键值拼接成 k=v; k=v 形式的字符串赋值给 document.cookie

3、getCookie 方法的实现

(function() {
    var kvTool = {
        maxage: "max-age",
        path: "path",
        domain: "domain",
        secure: "secure"
    };

    function setCookie(k, v, options) {
        if (!options) {
            document.cookie = k + "=" + v;
        } else {
            var tmp = [];
            for (var key in options) {
                // { path='/', domain='pandashen.com' }
                tmp.push(kvTool[key] + "=" + options[key]);
            }
            document.cookie = k + "=" + v + "; " + tmp.join("; ");
        }
    }

    function getCookie(k) {
        var strCookie = document.cookie;
        // 形如: 'k=v; k=v; k=v; k=v'
        var kvs = strCookie.split(";").map(v => v.trim());
        var objCookie = {};

        kvs.forEach(v => {
            var kv = v.split("=");
            objCookie[kv[0]] = kv[1];
        });

        return objCookie[k];
    }

    var cookieUtil = function() {};

    window.cookieUtil = cookieUtil;
})();

getCookie 方法只有一个参数,即我们要获取的 cookie 的某一个属性的键,函数会将对应的值返回。

其实对外暴露的方法只有 cookieUtil,所以 setCookiegetCookie 都是在 cookieUtil 内部调用的。

4、cookieUtil 方法的实现

(function() {
    var kvTool = {
        maxage: "max-age",
        path: "path",
        domain: "domain",
        secure: "secure"
    };

    function setCookie(k, v, options) {
        if (!options) {
            document.cookie = k + "=" + v;
        } else {
            var tmp = [];
            for (var key in options) {
                // { path='/', domain='pandashen.com' }
                tmp.push(kvTool[key] + "=" + options[key]);
            }
            document.cookie = k + "=" + v + "; " + tmp.join("; ");
        }
    }

    function getCookie(k) {
        var strCookie = document.cookie;
        // 形如: 'k=v; k=v; k=v; k=v'
        var kvs = strCookie.split(";").map(v => v.trim());
        var objCookie = {};

        kvs.forEach(v => {
            var kv = v.split("=");
            objCookie[kv[0]] = kv[1];
        });

        return objCookie[k];
    }

    var cookieUtil = function(key, value, options) {
        if (!value) {
            // 没有传参, 得到数据
            return getCookie(key);
        } else {
            setCookie(key, value, options);
        }
    };

    window.cookieUtil = cookieUtil;
})();

cookieUtil 的逻辑为当 keyvalue 两个参数都传入时,调用 setCookie 来设置 cookie,只传入 key 时,调用 getCookie 获取 cookie 对应参数的值。

上面就是我们封装的 cookie 功能模块来帮主我们设置和获取 cookie,之所以封装这个功能最终的目的就是让我们更方便的通过 JavaScript 来操作 cookie


好的,关于cookie封装,可以实现增删改查功能,以下是一个简单的实现: ```javascript // 封装cookie操作的工具函数 const cookieUtils = { // 获取cookie值 get(key) { const cookieStr = document.cookie; const cookieArr = cookieStr.split('; '); for (let i = 0; i < cookieArr.length; i++) { const itemArr = cookieArr[i].split('='); if (itemArr[0] === key) { return itemArr[1]; } } return null; }, // 设置cookie值 set(key, value, expires = 0, path = '/') { const date = new Date(); date.setTime(date.getTime() + expires * 24 * 60 * 60 * 1000); const expiresStr = expires === 0 ? '' : ';expires=' + date.toGMTString(); document.cookie = `${key}=${value};path=${path}${expiresStr}`; }, // 删除cookie值 remove(key, path = '/') { this.set(key, '', -1, path); }, // 更新cookie值 update(key, value, expires = 0, path = '/') { this.set(key, value, expires, path); }, }; ``` 使用方法如下: ```javascript // 设置cookie cookieUtils.set('username', 'Tom', 7, '/'); // 获取cookie const username = cookieUtils.get('username'); // 更新cookie cookieUtils.update('username', 'Jerry', 7, '/'); // 删除cookie cookieUtils.remove('username'); ``` 其中,`set`方法用于设置cookie值,第一个参数为cookie的名称,第二个参数为cookie的值,第三个参数为cookie的过期时间(单位为天),默认为0(表示在当前会话结束时过期),第四个参数为cookie的路径,默认为根路径。`get`方法用于获取cookie值,第一个参数为cookie的名称。`update`方法用于更新cookie值,其参数和`set`方法相同。`remove`方法用于删除cookie值,第一个参数为cookie的名称,第二个参数为cookie的路径,默认为根路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值