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

本文介绍了一个基于本地存储的数据库封装方案,通过定义BaseLocalStorage类,实现了数据的添加、获取和删除功能,同时支持时间戳控制数据的有效期。该方案利用localStorage进行数据存储,通过预设的前缀和时间戳拼接符,实现数据的有效管理和访问。
/*
数据访问对象模式:
抽象和封装对数据源的访问与存储,DAO通过对数据源链接的管理方便对数据的访问与存储。
*/

var BaseLocalStorage = function(preId, timeSign) {
    //定义本地存储数据库前缀
    this.preId = preId;
    //定义时间戳与存储数据之间的拼接符
    this.timeSign = timeSign || '|-|';
}

BaseLocalStorage.prototype = {
    //操作状态
    status: {
        SUCCESS: 0,
        FAILURE: 1,
        OVERFLOW: 2,
        TIMEOUT: 2
    },
    storage: localStorage || window.localStorage,
    //获取本地存储数据库数据真实字段
    getKey: function(key) {
        return this.preId + key;
    },
    //添加(修改)数据
    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 * 31;
        }
        try {
            this.storage.setItem(key, time + this.timeSign + value);
        } catch (e) {
            status = this.status.OVERFLOW;
        }
        callback && callback.call(this, status, key, value);
    },
    get: function(key, callback) {
        var status = this.status.SUCCESS,
            key = this.getKey(key),
            value = null,
            //时间戳与存储数据之间的拼接符长度
            timeSignLen = this.timeSign.length,
            that = this,
            index,
            time,
            result;
        try {
            value = that.storage.getItem(key);
        } catch (e) {
            result = {
                status: that.status.FAILURE,
                value: null
            }
            callback && callback.call(this, result.status, result.value);
        }
        if (value) {
            index = value.indexOf(that.timeSign);
            time = +value.slice(0, index);
            //如果时间过期
            if (new Date(time).getTime() > new Date().getTime() || time == 0) {
                value = value.slice(index + timeSignLen);
            } else {
                value = null;
                status = that.status.TIMEOUT;
                that.remove(key);
            }
        } else {
            status = that.status.FAILURE;
        }
        result = {
            status: status,
            value: value
        }
        callback && callback.call(this, result.status, result.value);
        return result;
    },
    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.timeSign) + this.timeSign.length));
    }
}


var ls = new BaseLocalStorage('LS_');
ls.set('a', 'xiao ming', function() { console.log(arguments) });
ls.get('a', function() { console.log(arguments) })
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值