首页 系统教程 操作系统 JavaScript面向对象轻松入门之综合

JavaScript面向对象轻松入门之综合

Mar 14, 2024 pm 03:22 PM
linux linux教程 红帽 linux系统 数据访问 linux命令 linux认证 红帽linux linux视频

JavaScript面向对象轻松入门之综合

需求:

几乎所有的web应用都需要保存数据一些到本地,那么我们就来做一个数据储存器吧。

详细需求:

当本地储存有数据时,取用本地的数据,没有时使用默认的数据
判断本地的数据是否过时,如果过时则不使用
默认使用localStorage,但支持使用其它储存方式,并且要支持多方储存,多方读取

抽象出对象

根据需求里面的关键字,我们抽象出三个对象:数据访问、数据、储存器
数据储存管理器负责管理数据,对外暴露接口
数据对象负责对数据的操作
储存器负责保持数据,读取数据

储存器对象

DataStorageManagerBase暴露两个接口save()和load(),模拟抽象类,告诉子类一定要实现这两个方法。
下面的例子用LocalStorage实现了一个子类,当然你也可以用cookie或其它方式实现。
为什么要把LocalStorage这些储存器进行二次封装呢?直接用不就可以了吗?
因为各种储存器等api都是不一样等,我们二次封装后可以确保无论什么储存器对外暴露的接口都是save()和load()。

/*模拟数据储存器抽象类,其实这个类不要也可以*/
class DataStorageManagerBase {
    static getIns() {
        /* 储存器在整个应用的生命周期里应该只有一个实例 */
        if (!this._ins) this._ins = new this();
        return this._ins;
    }
    constructor() {
        this.name = null;
    }
    save(name/* string */, data/* any */) {
        throw '"' + this.constructor.name + "'类没有save()方法";
    }
    load(name/* string */) {
        throw '"' + this.constructor.name + "'类没有load()方法";
    }
}
class LocalStorageManager extends DataStorageManagerBase {
    static getIns() {
        /* 静态方法不能继承 */
        if (!this._ins) this._ins = new this();
        return this._ins;
    }
    constructor() {
        super();
        this.name = 'localStorage';
    }
    save(name/* string */, data/* any */) {
        console.log(name,data)
        if (!window.localStorage) return this;//判断这个储存器可用不可用,你也可以在这里抛出错误
        window.localStorage[name] = JSON.stringify(data);
        return this;
    }
    load(name/* string */) {
        //如果储存器不可用,返回false
        if (!window.localStorage) return false;
        //如果没有这个数据,返回false
        if (!window.localStorage[name]) return false;
        let dataLoaded = JSON.parse(window.localStorage[name]);
        return dataLoaded;
    }
}
数据对象

对数据的操作:保存、读取、判断版本等

class GlobalData {
    static addStorage(storage/* DataStorageManagerBase */) {
        /*动态添加储存器*/
        this._storages.push();
    }
    static getStorages() {
        return this._storages;
    }
    constructor(name, data, version) {
        this.name = name;
        this.data = data;
        this.version = version || 1;
        this._loadData();
        //初始化的该对象的时候,读取localStorage里的数据,看有没有已储存的数据,有就用该数据
    }
    getData() {
        return this._copy(this.data);
    }
    setData(data, notSave) {
        this.data = this._copy(data);
        if (!!notSave) return this;
        let dataToSave = {
            name: this.name,
            version: this.version,
            data: this.data
        };
        let storages = GlobalData.getStorages();
        for (let i = 0, l = storages.length; i 
<div style="font-size: 14pt; color: white; background-color: black; border-left: red 10px solid; padding-left: 14px; margin-bottom: 20px; margin-top: 20px;"><strong>数据访问对象</strong></div>
<p>对数据对象管理,对外暴露三个接口getData(),setData(),config(),用户通过这三个接口使用这个模块</p>
<pre class="brush:php;toolbar:false">class GlobalDataDao {
    static getIns() {
        if (!this._ins) this._ins = new this();
        return this._ins;
    }
    constructor() {
        this.GlobalDataClass = GlobalData;
        this._dataList = [];
    }
    getData(name/* string */) {
        let dataIns = this.getDataIns(name);
        if (!!dataIns) {
            return dataIns.getData();
        } else {
            return null;
        }
    }
    setData(name/* string */, data/* any */, notSave = false/* ?boolean */) {
        let dataIns = this.getDataIns(name);
        dataIns.setData(data, notSave);
        return this;
    }
    config(configs/* Array */) {
        /* 初始化数据
        interface Config {
            name: string;
            data; any;
            version?: number;
        }
        */
        for (let i in configs) {
            let de = configs[i];
            if (!!this.getDataIns(de.name)) {
                /* 如果数据名重复,抛出错误 */
                throw new Error('data name "' + de.name + '" is exist');
            };
            let dataIns = new GlobalData(de.name, de.data, de.version);
            this._dataList.push(dataIns);
        }
        return this;
    }
    getDataIns(name/* string */) {
        for (let i in this._dataList) {
            if (this._dataList[i].name === name) {
                return this._dataList[i];
            }
        }
        return false;
    }
}
使用
/*用法*/
let globalDataManeger = GlobalDataDao.getIns();

let configs = [
    {
        name: 'languageUsing',
        version: 1,
        data: {
            name: '简体中文',
            value: 'zh-cn'
        }
    }, {
        name: 'userPreference',
        version: 1,
        data: {
            theme: 'blue',
            menu: 'side_bar'
        }
    }
];
globalDataManeger.config(configs);
console.log(globalDataManeger);
let languageUsing = globalDataManeger.getData('languageUsing');
console.log(languageUsing);
languageUsing.name = 'English';
languageUsing.value = 'en';
globalDataManeger.setData('languageUsing', languageUsing);

以上是JavaScript面向对象轻松入门之综合的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

Rimworld Odyssey温度指南和Gravtech
1 个月前 By Jack chen
Rimworld Odyssey如何钓鱼
1 个月前 By Jack chen
我可以有两个支付帐户吗?
1 个月前 By 下次还敢
初学者的Rimworld指南:奥德赛
1 个月前 By Jack chen
PHP变量范围解释了
3 周前 By 百草

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Laravel 教程
1603
29
PHP教程
1506
276
修复无法在Windows Google Chrome上传文件 修复无法在Windows Google Chrome上传文件 Jul 08, 2025 pm 02:33 PM

在GoogleChrome中上传文件时遇到问题?这可能很烦人,对吧?无论您是将文档附加到电子邮件、在社交媒体上共享图像,还是提交工作或学校的重要文件,流畅的文件上传过程都是至关重要的。因此,如果您的文件上传在WindowsPC上的Chrome中持续失败,可能会令人沮丧。如果您还没有准备好放弃您最喜欢的浏览器,这里有一些提示修复无法在WindowsGoogleChrome上传文件1.从通用修复开始在我们了解任何高级故障排除技巧之前,最好先尝试下面提到的一些基本解决方案。排除互联网连接问题:互联网连

如何在Linux中找到我的私人和公共IP地址? 如何在Linux中找到我的私人和公共IP地址? Jul 09, 2025 am 12:37 AM

在Linux系统中,1.使用ipa或hostname-I命令可查看私有IP;2.使用curlifconfig.me或curlipinfo.io/ip可获取公网IP;3.桌面版可通过系统设置查看私有IP,浏览器访问特定网站查看公网IP;4.可将常用命令设为别名以便快速调用。这些方法简单实用,适合不同场景下的IP查看需求。

安装Linux的系统要求 安装Linux的系统要求 Jul 20, 2025 am 03:49 AM

LinuxCanrunonModestHardwarewtareWithSpecificminimumRequirentess.A1GHZPROCESER(X86ORX86_64)iSNEDED,withAdual-Corecpurecommondend.r AmshouldBeatLeast512MbForCommand-lineUseor2Gbfordesktopenvironments.diskSpacePacereQuiresaminimumof5-10GB,不过25GBISBISBETTERFORAD

比特币代号是什么?比特币是什么样式的代码? 比特币代号是什么?比特币是什么样式的代码? Jul 22, 2025 pm 09:51 PM

比特币作为数字世界的先驱,其独特的代号和底层技术一直是人们关注的焦点。它的标准代号是 BTC,在某些符合国际标准的平台上也被称为 XBT。从技术角度看,比特币并非单一的代码样式,而是一个庞大且精密的开源软件项目,其核心代码主要由 C 语言编写,并融合了密码学、分布式系统和经济学原理,任何人都可以查看、审查和贡献其代码。

如何让PHP容器支持自动构建 PHP环境持续集成CI配置方式 如何让PHP容器支持自动构建 PHP环境持续集成CI配置方式 Jul 25, 2025 pm 08:54 PM

要让PHP容器支持自动构建,核心在于配置持续集成(CI)流程。1.使用Dockerfile定义PHP环境,包括基础镜像、扩展安装、依赖管理和权限设置;2.配置GitLabCI等CI/CD工具,通过.gitlab-ci.yml文件定义build、test和deploy阶段,实现自动构建、测试和部署;3.集成PHPUnit等测试框架,确保代码变更后自动运行测试;4.使用Kubernetes等自动化部署策略,通过deployment.yaml文件定义部署配置;5.优化Dockerfile,采用多阶段构

如何使用'关闭”命令 如何使用'关闭”命令 Jul 15, 2025 am 12:26 AM

Linux/macOS的shutdown命令可通过参数实现关机、重启、定时操作等。1.立即关机使用sudoshutdownnow或-h/-P参数;2.定时关机用 时间或具体时间点,取消用-c;3.重启使用-r参数,支持定时重启;4.注意需sudo权限,远程操作谨慎,避免数据丢失。

如何搭建独立PHP任务容器环境 PHP定时脚本运行容器配置方法 如何搭建独立PHP任务容器环境 PHP定时脚本运行容器配置方法 Jul 25, 2025 pm 07:27 PM

搭建独立PHP任务容器环境可通过Docker实现,具体步骤如下:1.安装Docker与DockerCompose作为基础;2.创建独立目录存放Dockerfile、crontab文件;3.编写Dockerfile定义PHPCLI环境并安装cron及必要扩展;4.编写crontab文件定义定时任务;5.编写docker-compose.yml挂载脚本目录并配置环境变量;6.启动容器并验证日志。相比Web容器内执行定时任务,独立容器具备资源隔离、环境纯粹、稳定性强、便于扩展等优势。为确保日志与错误捕

如何在Linux上安全删除硬盘驱动器 如何在Linux上安全删除硬盘驱动器 Jul 24, 2025 am 12:08 AM

确认目标硬盘设备名(如/dev/sda),避免误删系统盘;2.使用sudoddif=/dev/zeroof=/dev/sdXbs=1Mstatus=progress全盘覆写零值,适用于大多数场景;3.敏感数据使用sudoshred-v-n3/dev/sdX进行三次随机数据覆写,确保无法恢复;4.可选执行sudobadblocks-wsv/dev/sdX做破坏性写入测试;最后用sudohexdump-C/dev/sdX|head验证是否全为零,完成安全擦除。

See all articles