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中文網其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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