实现一个 Storage

213 阅读2分钟

描述

实现一个store,使得该对象为单例模式,基于localStore进行封装,实现setItem(key,value)和getItem(key)

实现静态方法版本

 // 定义一个Storage
 class Storage{
    static GetInstance(){
        // 判断是否已经new过一个实例
        if(!Storage.instance){
            // 若这个唯一实例不存在,那么就先创建他
            Storage.instance = new Storage()
        }
        // 如果存在这个实例,那么就直接返回
        return Storage.instance
    }
    getItem(key){
        return localStorage.getItem(key)
    }
    setItem(key,value){
         return localStorage.setItem(key,value)
    }
 }
const storage1 = Storage.getInstance()
const storage2 = Storage.getInstance()

storage1.setItem('name', '李雷')
// 李雷
storage1.getItem('name')
// 也是李雷
storage2.getItem('name')

// 返回true
storage1 === storage2

闭包版

 先实现一个基础的StorageBase类,把getItem,setItem的方法放在原型链上
 function StorageBase(){}
 StorageBase.prototpye.setItem(key,value){
     localStorage.setItem(key,value)
 }
  StorageBase.prototpye.getItem(key){
     localStorage.setItem(key)
 }
 // 以闭包的形式创建一个引用自由变量的构造函数
 
 const Stroage = function(){
     let instance = null
     return function(){
         if(!instance){
       instance = new StorageBase()
     }
     return instance
     }
     
 }
     // 这里其实不用 new Storage 的形式调用,直接 Storage() 也会有一样的效果 
    const storage1 = new Storage()
    const storage2 = new Storage()
    
    storage1.setItem('name', '李雷')
    // 李雷
    storage1.getItem('name')
    // 也是李雷
    storage2.getItem('name')
    
    // 返回true
    storage1 === storage2

实现一个全局的模态框

这道题比较经典,基本上所有讲单例模式的文章都会以此为例,同时它也是早期单例模式在前端领域的最集中体现。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>单例模式弹框</title>
</head>
<style>
    #modal {
        height: 200px;
        width: 200px;
        line-height: 200px;
        position: fixed;
        left: 50%;
        top: 50%;
        transform: translate(-50%, -50%);
        border: 1px solid black;
        text-align: center;
    }
</style>
<body>
	<button id='open'>打开弹框</button>
	<button id='close'>关闭弹框</button>
</body>
<script>
    // 核心逻辑,这里采用了闭包思路来实现单例模式
    const Modal = (function() {
    	let modal = null
    	return function() {
            if(!modal) {
            	modal = document.createElement('div')
            	modal.innerHTML = '我是一个全局唯一的Modal'
            	modal.id = 'modal'
            	modal.style.display = 'none'
            	document.body.appendChild(modal)
            }
            return modal
    	}
    })()
    
    // 点击打开按钮展示模态框
    document.getElementById('open').addEventListener('click', function() {
        // 未点击则不创建modal实例,避免不必要的内存占用;此处不用 new Modal 的形式调用也可以,和 Storage 同理
    	const modal = new Modal()
    	modal.style.display = 'block'
    })
    
    // 点击关闭按钮隐藏模态框
    document.getElementById('close').addEventListener('click', function() {
    	const modal = new Modal()
    	if(modal) {
    	    modal.style.display = 'none'
    	}
    })
</script>
</html>