# 封装Mylocalstorage

// 构建单件设计模式
//   第一步:把构造器设置为私有的,不允许外部来创建类的实例【对象】
//   第二步: 至少应该提供一个外部访问的方法或属性,外部可以通过这个方法或属性来得到一个对象
//           所以应该把这个方法设置为静态方法
//   第三步:外部调用第二步提供的静态方法来获取一个对象
export default class MyLocalStorage {
  // 静态属性和对象属性[实例属性】是类中两大成员
  static localstorage: MyLocalStorage //静态引用属性
  constructor() {
    console.log('这是TS的单件设计模式的静态方法的构造器')
  }
  // 提供一个外部访问的方法,
  // 通过这个方法用来提供外部得到一个对象的方法

  //   1. 带static关键字的方法就是一个静态方法
  //   2. 静态方法和对象无关,外部的对象变量不能调用静态方法和静态属性,
  //   3. 外部可以通过类名来调用
  //   静态方法不可以访问实例属性或实例方法【对象属性或对象方法】
  public static getInstance() {
    if (!this.localstorage) {
      //如果静态对象属性指向创建对象j
      console.log('我是一个undefined的静态属性,用来指向一个对象空间的静态属性')
      this.localstorage = new MyLocalStorage()
    }

    return this.localstorage
  }

  // 保存key-value
  public setItem(key: string, value: any) {
    if (!key || !value) {
      return null
    }
    localStorage.setItem(key, JSON.stringify(value))
  }

  public getItem(key: string) {
    let value = localStorage.getItem(key)
    return value != null ? JSON.parse(value) : null
  }

  public deleteItem(key: string) {
    if (!key) {
      return;
    }
    key = key.toString();
    localStorage.removeItem(key);
  }

  public clear() {
    localStorage.clear()
  }
}