首頁 系統教程 Linux 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

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

linux如何限制用戶資源? ulimit怎麼配置? linux如何限制用戶資源? ulimit怎麼配置? May 29, 2025 pm 11:09 PM

Linux系統通過ulimit命令限制用戶資源,防止資源過度佔用。 1.ulimit是shell內置命令,可限製文件描述符數(-n)、內存大小(-v)、線程數(-u)等,分為軟限制(當前生效值)和硬限制(最高上限)。 2.臨時修改直接使用ulimit命令,如ulimit-n2048,但僅對當前會話有效。 3.永久生效需修改/etc/security/limits.conf及PAM配置文件,並添加sessionrequiredpam_limits.so。 4.systemd服務需在unit文件中設置Lim

Informix與MySQL在Linux上的比較 Informix與MySQL在Linux上的比較 May 29, 2025 pm 11:21 PM

Informix和MySQL均為廣受青睞的關係型數據庫管理系統,它們在Linux環境下均表現優異並得到廣泛應用。以下是對兩者在Linux平台上的對比分析:安裝與配置Informix:在Linux上部署Informix需要下載對應的安裝文件,隨後依據官方文檔指引完成安裝及配置流程。 MySQL:MySQL的安裝過程較為簡便,可通過系統的包管理工具(例如apt或yum)輕鬆實現安裝,並且網絡上有大量的教程和社區支持可供參考。性能表現Informix:Informix以卓越的性能和

mysql怎麼調成中文界面 輕鬆設置mysql中文語言環境 mysql怎麼調成中文界面 輕鬆設置mysql中文語言環境 Jun 04, 2025 pm 06:36 PM

要把MySQL調成中文界面,可以通過MySQLWorkbench或命令行工具實現。 1)在MySQLWorkbench中,打開“Preferences”,選擇“Appearance”選項卡,然後在“Language”下拉菜單中選擇“Chinese(Simplified)”,重啟即可。 2)使用命令行工具時,設置操作系統的語言環境變量,如在Linux或macOS上使用“exportLANG=zh_CN.UTF-8”,然後運行mysql客戶端。

SFTP服務在Debian上如何啟動 SFTP服務在Debian上如何啟動 May 29, 2025 pm 10:51 PM

在Debian系統中啟動SFTP服務,通常需要藉助OpenSSH服務器。以下是具體的步驟:1.安裝OpenSSH服務器首先,確認你的Debian系統上已安裝OpenSSH服務器。若未安裝,可以通過以下命令完成安裝:sudoaptupdatesudoaptinstallopenssh-server2.啟動OpenSSH服務器安裝完成後,OpenSSH服務器一般會自動啟動。你可以通過以下命令查看其運行狀態:sudosystemctlstatusssh如果服務未運行,可使用以下命令啟動:s

Linux和Windows之間的資源使用率(CPU,內存)有何不同? Linux和Windows之間的資源使用率(CPU,內存)有何不同? Jun 05, 2025 am 12:13 AM

Linux和Windows在CPU和內存使用上各有優劣:1)Linux採用基於時間片的調度算法,確保公平性和高效性;Windows使用優先級調度,可能會導致低優先級進程等待。 2)Linux通過分頁和交換機制管理內存,減少碎片;Windows傾向於預分配和動態調整,效率可能波動。

Linux和Windows的所有權成本有何不同? Linux和Windows的所有權成本有何不同? Jun 09, 2025 am 12:17 AM

Linux的擁有成本通常低於Windows。 1)Linux無需許可證費用,節省大量成本,而Windows需購買許可證。 2)Linux對硬件要求低,可延長設備使用壽命。 3)Linux社區提供免費支持,降低維護成本。 4)Linux安全性高,減少生產力損失。 5)Linux學習曲線較陡,但Windows更易上手。選擇應基於具體需求和預算。

在Linux上安裝Redis的先決條件是什麼? 在Linux上安裝Redis的先決條件是什麼? Jun 10, 2025 am 12:02 AM

安裝RedisonLinux需要以下幾個前提條件:1.一個Linux發行版,如Ubuntu、CentOS或Debian;2.GCC編譯器,用於從源代碼編譯Redis;3.Make和libc6-dev,用於構建Redis;4.Tcl(可選),用於運行Redis測試。這些工具確保了Redis的順利安裝和測試。

I/O操作的性能在Linux和Windows之間有何不同? I/O操作的性能在Linux和Windows之間有何不同? Jun 07, 2025 am 12:06 AM

LinuxoftenoutperformsWindowsinI/Operformanceduetoitscustomizablekernelandfilesystems,whileWindowsoffersmoreuniformperformanceacrosshardware.1)LinuxexcelswithcustomizableI/OschedulerslikeCFQandDeadline,enhancingperformanceinhigh-throughputapplications

See all articles