JavaScript设计模式(三) 数据访问对象模式

JavaScript设计模式(五):技巧型设计模式-链模式(jQuery实现机制)、委托模式、数据访问对象模式、节流模式、简单模板模式、惰性模式、参与者模式(柯里化)、等待者模式(Promise) 实现类似于的框架语法 原型式继承 找位助手 此时因为返回的是,所以使用访问不到.于是我们可以借助第对象进行访问 而在中,为了减少变量的定义,将想使用的变量作为了的一个 获取元素 两个问题 此时是无法访问方法的,因为返回的是元素,故可以使用解决 覆盖问题: 覆盖获取 : 使用new关键字进行处理,让被赋值的变量都是独立的对象 方法丢失 对比jQuery 对比返回对象的构造器 解决方法: 丰富元素获取 数组与对象 方法拓展 添加方法并使用 区别 未 阅读详情

引言

HTML5 提供了两种在客户端存储数据的新方法:localStorage、sessionStorage,他们是Web Storage API 提供的两种存储机制,区别在于前者属于永久性存储,而后者是局限于当前窗口的数据传递,存储在其中的数据会在当前会话结束时被删除。localStorage、sessionStorage的具体内容在这里就不多做介绍了,我们主要探讨一下在实际开发中怎样合理使用他们。

问题

大部分网站会将一些数据(如:用户Token)存储在前端,用来实现页面间的传值,对于一些大型Web应用来说,其存储的数据可能会非常多,数据的管理会变得复杂,并且一个大型项目是由多位程序员共同开发的,这时就会遇到一个问题:怎样确保自己的数据不会覆盖掉其他人的呢?因为在一个页面中大家都是使用同一个WebStorage对象,总不能把大家使用过的Key记录下来吧。这时候就可以使用数据访问对象模式来解决了。

数据访问对象模式(DAO)

数据访问对象模式就是对数据源的访问与存储进行封装,提供一个数据访问对象类负责对存储的数据进行管理和操作,规范数据存储格式,类似于后台的DAO层。
由于WebStorage采用Key-Value的方式存取数据,而且只能存字符串(任何类型存储的时候都会被转为字符串,读取的时候需要进行类型转换),所以我们可以对Key的格式进行规范,比如模块名+Key,开发人员+Key等,还可以在值中添加一段前缀用来描述数据,如添加数据过期日期的时间戳,用来管理数据的生命周期。具体格式项目组可以自己定义,主要是便于管理,防止出现冲突,约定好规范后就可以开始定义数据访问对象了。

下面以localStorage为例,介绍一下数据访问对象类的定义和使用。

代码示例

DAO类基本结构

数据访问对象类的基本结构如下,我们给键值添加了一段前缀用来避免键值冲突,并且在值中加入数据过期时间戳以及分隔符,获取值的时候再进行判断是否过期,这样可以更灵活地管理存储数据的生命周期。这里还用到了回调的方式,方便获取数据访问过程的具体结果,以及在必要时执行相关操作。

/**
 * LocalStorage数据访问类
 * @param {string} prefix Key前缀
 * @param {string} timeSplit 时间戳与存储数据之间的分割符
 */
var Dao = function (prefix, timeSplit) {
    this.prefix = prefix;
    this.timeSplit = timeSplit || '|-|';
}
// LocalStorage数据访问类原型方法
Dao.prototype = {
    // 操作状态
    status: {
        SUCCESS: 0,     // 成功
        FAILURE: 1,     // 失败
        OVERFLOW: 2,    // 溢出
        TIMEOUT: 3      // 过期
    },
    // 本地存储对象
    storage: localStorage || window.localStorage,
    // 获取带前缀的真实键值
    getKey: function (key) {
        return this.prefix + key;
    },
    // 添加(修改)数据
    set: function (key, value, callback, time) {
       ...
    },
    // 获取数据
    get: function (key, callback) {
        ...
    },
    // 删除数据
    remove: function (key, callback) {
        ...
    }
}

添加(修改)数据

/**
    * 添加(修改)数据
    * @param key 数据字段标识
    * @param value 数据值
    * @param callback 回调函数
    * @param time 过期时间
    */
    set: function (key, value, callback, time) {
        // 默认为成功状态
        var status = this.status.SUCCESS,
            key = this.getKey(key);
        try {
            // 获取过期时间戳
            time = new Date(time).getTime() || time.getTime();
        } catch (e) {
            // 未设置过期时间时默认为一个月
            time = new Date().getTime() + 1000 * 60 * 60 * 24 * 30;
        }
        try {
            // 向本地存储中添加(修改)数据
            this.storage.setItem(key, time + this.timeSplit + value);
        } catch (e) {
            // 发生溢出
            status = this.status.OVERFLOW;
        }
        // 执行回调并传入参数
        callback && callback.call(this, status, key, value);
    }

获取数据

/**
    * 获取数据
    * @param key 数据字段标识
    * @param callback 回调函数
    */
    get: function (key, callback) {
        var key = this.getKey(key),
            status = this.status.SUCCESS,    // 获取数据状态
            value = null;    // 获取数据值

        try {
            // 从本地存储获取数据
            value = this.storage.getItem(key);
        } catch (e) {
            // 获取数据失败
            status = this.status.FAILURE;
            value = null;
        }

        // 如果成功获取数据
        if (status !== this.status.FAILURE) {
            var index = value.indexOf(this.timeSplit),
                timeSplitLen = this.timeSplit.length,
                // 获取时间戳
                time = value.slice(0, index);
            // 判断数据是否未过期
            if (new Date(1*time).getTime() > new Date().getTime() || time == 0) {
                // 获取数据值
                value = value.slice(index + timeSplitLen);
            } else {
                // 数据已过期,删除数据
                value = null;
                status = this.status.TIMEOUT;
                this.remove(key);
            }
        }

        // 执行回调
        callback && callback.call(this, status, value);
        // 返回结果值
        return value;
    }

删除数据

/**
    * 删除数据
    * @param key 数据字段标识
    * @param callback 回调函数
    */
    remove: function (key, callback) {
        // 设置默认状态为失败
        var status = this.status.FAILURE,
            key = this.getKey(key),
            value = null;
        try {
            // 获取数据值
            value = this.storage.getItem(key);
        } catch (e) {
            // 数据不存在,不采取操作
        }
        // 如果数据存在
        if (value) {
            try {
                // 删除数据
                this.storage.removeItem(key);
                status = this.status.SUCCESS;
            } catch (e) {
                // 数据删除失败,不采取操作
            }
        }
        // 执行回调并传入参数,删除成功则传入被删除的数据值
        callback && callback.call(this, status, status > 0 ? null : value.slice(value.indexOf(this.timeSplit) + this.timeSplit.length));
    }

用法

var dao = new Dao('myModule_');
// 添加/修改数据
dao.set('token', 'abc', function () { console.log(arguments); });
// 获取数据
var value = dao.get('token', function () { console.log(arguments); });
console.log(value);
// 删除数据
dao.remove('token', function () { console.log(arguments); });

写在最后

其实数据访问对象模式更适合与服务器端的数据库操作,比如在nodejs中操作MongoDB,通过对数据库增删改查操作的封装,可以方便我们对前端存储的管理,不必为操作数据库感到烦恼,DAO已经为我们提供了便捷统一的接口,这样在团队开发中就不用担心影响到其他人的数据了。

ADS新手必看:ICCAP数据导入与导出CSV的完整流程(附常见问题解决) 本文为ADS新手详细讲解了如何将ICCAP测试数据导入ADS进行仿真分析,并导出为通用CSV格式的完整流程。内容涵盖文件格式解析、导入设置、数据验证、处理技巧及常见问题排查,重点解决了数据文件导入过程中的兼容性与单位映射等核心难点,帮助射频工程师高效连接测量与仿真环节。 阅读详情

相关推荐

ubuntu20.4源码安装最新gcc(gcc V12.2)

Ubuntu20.4自带的gcc为V9.4.0的版本,老版本的gcc存在不支持新版本C语言规范,在配置、编译、安装应用软件或工具时,可能存在不能正确安装的问题。(比如:libpqxx-7.7.4在配置时要求c++17版本的支持,但gcc V9.4.0版本不支持c++17)。因此本文介绍ubuntu20.4的系统下载最新gcc12.2版本源码,并进行本地编译、安装。本节内容包括gcc12.2的必备库安装和gcc12.2安装两部分内容组成。

q544344318的博客 1万+

JS设计模式数据访问对象模式的实例讲解

下面小编就为大家带来一篇JS设计模式数据访问对象模式的实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

对象关系映射与单元测试:深入数据访问设计模式

本文深入探讨了对象关系映射(ORM)和单元测试在数据访问设计模式中的应用。通过比较不同的数据访问方法,我们发现面向对象的方法虽然在开始时可能显得繁琐,但长远来看却能提供更大的灵活性。同时,文章还探讨了优化查询以提高性能的实际案例,以及单元测试框架SimpleTest和PHPUnit的使用技巧。

weixin_30661119的博客 470

JavaScript设计模式(二十七)数据访问对象模式

/* 数据访问对象模式: 抽象和封装对数据源的访问与存储,DAO通过对数据源链接的管理方便对数据的访问与存储。 */ var BaseLocalStorage = function(preId, timeSign) { //定义本地存储数据库前缀 this.preId = preId; //定义时间戳与存储数据之间的拼接符 this.timeSign = timeSign || '|-|'; } BaseLocalStorage.prototype = { //操

极客神殿 248

Javascript设计模式-数据访问对象模式

/* * 本地存储类 * 参数preId 本地数据存储库前缀 * 参数timeSign 时间戳与存储数据之间的拼接符 * */ var BaseLocalStorege=function(preId,timeSign){ //定义本地存储数据库前缀 this.preId=preId; //定义时间戳与存储数据之间的拼接符 this

qq_27783647的博客 371

js设计模式之(传输对象模式

传输对象模式 传输对象模式(Transfer Object Pattern)用于从客户端向服务器一次性传递带有多个属性的数据。传输对象也被称为数值对象。传输对象是一个具有 getter/setter 方法的简单的 POJO 类,它是可序列化的,所以它可以通过网络传输。它没有任何的行为。服务器端的业务类通常从数据库读取数据,然后填充 POJO,并把它发送到客户端或按值传递它。对于客户端,传输对象是只...

vv_bug 807

JavaScript对象模式验证工具——js-schema

JavaScript对象模式验证工具——js-schema 项目基础介绍 js-schema 是一个用 JavaScript 编写的开源项目,它提供了一个简洁直观的 schema 验证器。该项目主要使用 JavaScript 语言开发,旨在帮助开发者定义和验证对象的结构。通过js-schema,开发者可以轻松地声明对象模型,并且能够将其序列化或反序列化为流行的 JSON Schema 格式。 核心...

gitblog_00530的博客 371

JavaScript设计模式》初次笔记——wsdchong

JavaScript设计模式》初次笔记 前言 设计模式一直久仰大名,但是没有去花时间去了解,于是今天特意花时间去看《JavaScript设计模式》(2013年6月出版)和w3cschool上的设计模式。然后做了一些笔记。 以《JavaScript设计模式》为目录,以w3cschool上的设计模式为补充。 讲的内容有设计模式JavaScript设计模式、其他(模块化的JavaScript设计模式、jQuery设计模式、jQuery插件设计模式)。 学习目的:尝试性地了解JavaScript设计模式,方

wsdchong的博客 1万+

JavaScript设计模式浅析

JavaScript设计模式浅析JavaScript设计模式浅析一、工厂模式1、简单的工程模式2、工程模式实例二、建造者模式1、建造者模式例子、单体模式1、普通创建对象方式2、单体模式创建对象四、装饰器模式1、装饰器模式例子五、组合模式1、组合模式例子 JavaScript设计模式浅析 一、工厂模式 工程模式是一种比较简单的设计模式,主要用来创建对象用的 1、简单的工程模式 //1.简单的工程模式.html <!DOCTYPE html> <html lang="en"> <

wuyxinu的博客 2182

JS的几种设计模式

JS的几种简单设计模式

k464746的博客 1万+

Javascript——对象模式

对象模式 1》工厂模式 a)现实中的工厂差不多 b)在函数内部创建了一个新的空对象,最后返回这个对象 c)缺点:虽然new的是共同的一个函数,但是其中的方法做对比,返回false,也就意思说,new的函数,中的方法,不是共享(不是同一个地址). //工厂模式 function HotPotFactory() { var obj = { ...

weixin_40492102的博客 176

JavaScript设计模式-技巧型设计模式简介

技巧型设计模式是I通过一些特定技巧来解释组件的某些问题。主要包含链模式、委托模式、数据模式数据访问对象模式、节流模式、简单模板模式、惰性模式、参与者模式、等待者模式。 链模式 在对象方法中将当前对象返回,实现了对同一个对象多个方法链式调用。简化了在对对象多个方法的多次调用时,对该对象多次引用。在jQuery的使用中,链式调用是最平不过了。 /** * 链模式 * 元素获取的模式 * @pa...

读心悦 438

js对象模式的理解

js对象模式的理解 一.工厂模式: a)现实中的工厂差不多 b)在函数内部创建了一个新的空对象,最后返回这个对象对象不会暴露) c)缺点:虽然new的是共同的一个函数,但是其中的方法做对比,返回false,也就意思说,new的函数,中的方法,不是共享(不是同一个地址). eg: //现实中的工厂===>生产一瓶西瓜汁 //1》西瓜 ====>new Object(); //2》榨...

qq_25503949的博客 341

高级前端工程师必备的 JS 设计模式入门教程,常用设计模式案例分享

        什么是设计模式?为什么要有设计模式?单例模式、工厂模式、建造者模式、适配器模式、代理模式、装饰器模式、观察者模式、策略模式、状态模式分别是什么?他们解决了什么样的问题?本文将给您答案。

RenGJ010617的博客 6908

探索js-schema:JavaScript对象模式的新纪元

探索js-schema:JavaScript对象模式的新纪元 在现代Web开发中,数据验证是确保应用健壮性的关键步骤。js-schema,一个创新的JavaScript库,以其简洁的语法和强大的功能,为开发者提供了一种全新的方式来描述和验证对象模式。本文将深入探讨js-schema的特性、技术实现、应用场景及其独特之处。 项目介绍 js-schema是一个用于描述JavaScript对象模式的库,...

gitblog_00812的博客 507

JavaScript设计模式》读书笔记()

JavaScript设计模式》----张荣铭(四) 首先说一下什么是设计模式?以及我们为什么要学习设计模式设计模式的定义是:设计模式是在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案 也可以通俗的理解为:设计模式在某个特定场景下都某种问题的解决方案。当然,这也就是为什么我们要学习设计模式的原因。本书将设计模式按照类型分成六大类 创建型设计模式 结构型设计模式 行为型设计模式 技巧型设计模式 架构型设计模式 4 技巧型设计模式 4.1 链模式 通过在对象方法中将当前对象返回,实现对同一个对

qq_41022872的博客 285

设计模式知识连载(39)---数据访问对象模式---MongoDB

<body> <h3>设计模式知识连载(39)---数据访问对象模式:</h3> <p> 抽象和封装对数据源的访问和存储,DAO通过对数据源链接的管理方便对数据的访问与存储 </p><hr><script type="text/javascript"> /** * 案例二:MongoDB,方式一:初始 */ // 在nodejs中写入配置项 /* co

yuzhiboyouzhu的博客 208

深入探索与学习JavaScript设计模式(附20个常用JS设计模式

JavaScript设计模式为你提供了一种结构化的、可重复的方法来解决JavaScript开发中经常出现的问题。在本指南中,我们将看看什么是JavaScript设计模式以及如何在你的JavaScript应用程序中使用它们。

WPHunter的编程技术资料库! 1503

javaScript设计模式

JavaScript设计模式是一种在JavaScript开发中常用的编程模式,用于解决特定问题的代码组织和架构。通过使用设计模式,可以提高代码的可读性、可维护性和可扩展性。以下是几种常见的JavaScript设计模式:单例模式(Singleton Pattern):确保一个类只有一个实例,并提供全局访问点。工厂模式(Factory Pattern):根据参数的不同,创建不同的对象实例,隐藏具体的实现细节。

m0_74242675的博客 1410

中微单片机CMS79FT738, 736 样例程序,官方原版,给需要的同行参考

中微单片机在时下进口优质芯片难买的情况下是一个不错的选择

上一篇: JavaScript设计模式(二) 惰性模式
下一篇: 数据库记录删除方式
kMacro101
博客等级 码龄10年 3粉丝 30原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值