javascript基础学习系列一百三十八:代理捕获器与反射方法

代理可以捕获 13 种不同的基本操作。这些操作有各自不同的反射 API 方法、参数、关联 ECMAScript操作和不变式。
正如前面示例所展示的,有几种不同的 JavaScript 操作会调用同一个捕获器处理程序。不过,对于在代理对象上执行的任何一种操作,只会有一个捕获处理程序被调用。不会存在重复捕获的情况。
只要在代理上调用,所有捕获器都会拦截它们对应的反射 API 操作。
get()
get()捕获器会在获取属性值的操作中被调用。对应的反射 API 方法为 Reflect.get()。

const proxy = new Proxy(myTarget, { 
 get(target, property, receiver) { 
 console.log('get()'); 
 return Reflect.get(...arguments) 
 } 
}); 
proxy.foo; 
// get()
  1. 返回值
    返回值无限制。
  2. 拦截的操作
 proxy[property]
 Object.create(proxy)[property]
 Reflect.get(proxy, property, receiver)
  1. 捕获器处理程序参数
 property:引用的目标对象上的字符串键属性。①
 receiver:代理对象或继承代理对象的对象。
  1. 捕获器不变式
    如果 target.property 不可写且不可配置,则处理程序返回的值必须与 target.property 匹配。
    如果 target.property 不可配置且[[Get]]特性为 undefined,处理程序的返回值也必须是 undefined。
    set()
    set()捕获器会在设置属性值的操作中被调用。对应的反射 API 方法为 Reflect.set()。
const proxy = new Proxy(myTarget, { 
 set(target, property, value, receiver) { 
 console.log('set()'); 
 return Reflect.set(...arguments) 
 } 
}); 
proxy.foo = 'bar'; 
// set()
  1. 返回值
    返回 true 表示成功;返回 false 表示失败,严格模式下会抛出 TypeError。
  1. 拦截的操作
 proxy[property] = value
 Object.create(proxy)[property] = value
 Reflect.set(proxy, property, value, receiver)
  1. 捕获器处理程序参数
 property:引用的目标对象上的字符串键属性。
 value:要赋给属性的值。
 receiver:接收最初赋值的对象。
  1. 捕获器不变式
    如果 target.property 存在且不可配置,则处理程序必须返回 true。
    如果 target.property 存在且目标对象不可扩展,则处理程序必须返回 true。
Reflect.defineProperty()。
const myTarget = {}; 
const proxy = new Proxy(myTarget, { 
 defineProperty(target, property, descriptor) { 
 console.log('defineProperty()'); 
 return Reflect.defineProperty(...arguments) 
 } 
}); 
Object.defineProperty(proxy, 'foo', { value: 'bar' }); 
// defineProperty()
  1. 返回值
    defineProperty()必须返回布尔值,表示属性是否成功定义。返回非布尔值会被转型为布尔值。
  2. 拦截的操作
     Object.defineProperty(proxy, property, descriptor)
     Reflect.defineProperty(proxy, property, descriptor)
11. 捕获器处理程序参数
 target:目标对象。
 property:引用的目标对象上的字符串键属性。
 descriptor:包含可选的 enumerable、configurable、writable、value、get 和 set 定义的对象。
  1. 捕获器不变式
    如果目标对象不可扩展,则无法定义属性。
    如果目标对象有一个可配置的属性,则不能添加同名的不可配置属性。
    如果目标对象有一个不可配置的属性,则不能添加同名的可配置属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值