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