xr-storage的实现:

function createInstance(type: StorageType = 'localStorage'): StoreInstance {
  const context = new Store(type)
  const instance = Store.prototype.do.bind(context)
  extend(instance, context)
  return instance as StoreInstance
}

const store = createInstance()
const session = createInstance('sessionStorage')

store.session = session

export default store

createInstance 工厂函数的内部,我们首先实例化了 Store 实例 context,接着创建 instance 指向 Store.prototype.do 方法,并绑定了上下文 context ;接着通过 extend 方法把 context 中的原型方法和实例方法全部拷贝到 instance 上,这样就实现了一个混合对象:instance 本身是一个函数,又拥有了 Store 类的所有原型和实例属性,最终把这个 instance 返回。由于这里 TypeScript 不能正确推断 instance 的类型,我们把它断言成 StoreInstance 类型。
关于混合对象的问题,可以参考Hybrid Types的说明

据此,我们可以在实例中同时使用xr-storage的方法以及属性。

TIP:为何要用混合对象?

熟悉 axios 的人都知道,都支持axios({method:'get',...}) , axios.get('https://..')这样两种写法。 对于 xr-storage 这样简单的api来说,提供多种调用方式可能有点鸡肋,这是为了往后扩展做的 试验性尝试