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来说,提供多种调用方式可能有点鸡肋,这是为了往后扩展做的 试验性尝试 。