ES6学习-12.代理(Proxy)和反射(Reflection)API

一、代理和反射

代理可以拦截JavaScript引擎内部目标的底层对象操作,这些底层操作被拦截后会触发响应特定操作的陷阱函数。

反射API以Reflect对象的形式出现,对象中方法的默认特性与相同的底部操作一致,而代理可以覆写这些操作,每个代理陷阱对应一个命名和参数相同的Reflect方法。

二、创建一个简单的代理

用Proxy构造函数创建代理需要传入两个参数:目标和处理程序。例如:

ES6学习-12.代理(Proxy)和反射(Reflection)API_第1张图片

代理将所有操作直接转发到目标,将"proxy"赋值给proxy.name属性时会在目标上创建name,代理只是简单地将操作转发给目标,它不存储这个属性。由于proxy.name和target.name引用都是target.name,因此二者值相同。

三、使用set陷阱验证属性

如果你有一个对象,你想给这个对象设置的属性值,必须是数字,那么我们就需要验证,如果不是数字则抛出错误。为了实现这个需求,可以定义一个set陷阱来覆写设置值的默认特性。Reflect.set()是set陷阱对应的反射方法和默认特性。例如下面的代码:

ES6学习-12.代理(Proxy)和反射(Reflection)API_第2张图片

上面的代码当添加一个新的属性时数字的时候则添加成功,如果设置一个已经有的属性,那么也会成功。但是如果添加一个新的属性并且不是数字的话,则会报错。

四、用get陷阱验证对象结构

当你在从一个对象中读取属性的时候,如果这个属性不存在,那么JavaScript引擎就会用undefined代替属性的值。

那么我们就可以用代理通过检查对象结构来回避这个问题。例如:

ES6学习-12.代理(Proxy)和反射(Reflection)API_第3张图片

五、使用has陷阱隐藏已有属性

在代理中使用has陷阱可以拦截in操作并返回一个不同的值。例如:

ES6学习-12.代理(Proxy)和反射(Reflection)API_第4张图片

代理中的has陷阱会检查key是否为"value",如果是则返回false,不是则使用默认行为。

六、用deleteProperty陷阱防止删除属性

可以防止在严格模式下,删除了不可配置属性。例如:

ES6学习-12.代理(Proxy)和反射(Reflection)API_第5张图片

如上面的代码,就可以防止删除了"value"属性而造成错误。

你可能感兴趣的:(ES6学习-12.代理(Proxy)和反射(Reflection)API)