当我们调用一个函数的未定义属性时会报错。那么可以使用一个proxy拦截,并且传入dispatch函数,来使当调用未定义属性时,执行dispatch函数。
原理:
创建一个实例:function createInstance(target:object, dispatch:Functin)
将dispatch绑定到target的一个属性上,最好这个属性名使用Symbol防止重复
const NAME =Symbol('DISPATCH')
Object.assign(target, { [Name]: dispatch } )
return new Proxy(target, handler)
这里的handler是还没有写的,应该至少包括get和apply属性
在调用target的属性时,可以使用get来进行拦截key,判断是否未定义
如果未定义可以设置 handler的属性值 ifundefined = true,这个ifundefined值会在proxy的apply出产生作用。
当我们调用属性方法时,会被handler的apply拦截。apply拦截后判断ifundefined是否为true,如果为true表示:这个属性未定义,调用dispatch函数,即调用target[NAME]。并把args传给apply中。在apply中使用call调用方法
public apply(target: object, ctx: any, args: any[]) {
//调用对象的时候调用dispatch方法
const dispatch = target[NAME]
return dispatch.call(thisArg, this.keys, args)
}
这样的话就起到了调用未定义属性时执行指定函数的函数的作用