Proxy 对象
概述
- Proxy也就是代理,在目标对象前架设一层“拦截”,外界对该对象访问时,必须先通过这些拦截。
ES6原生提供Proxy构造函数,用来生产Proxy实例。
target代表要拦截的目标对象,handler也是一个对象,用于定制拦截的行为。
Proxy 支持拦截的13种操作
get(target, propKey, receiver):拦截对象属性的读取,比如proxy.foo和proxy['foo']。 set(target, propKey, value, receiver):拦截对象属性的设置,比如proxy.foo = v和proxy['foo'] = v。 has(target, propKey):拦截propKey in proxy操作,返回一个布尔值。 deleteProperty(target, propKey):拦截delete proxy[propKey], 返回一个布尔值 apply(target, ctx, args):拦截Proxy实例作为函数调用的操作,如:proxy(...args)、proxy.call(ctx, ...args)、proxy.apply(...). ownkeys(target): getOwnPropertyDescriptor(target, propKey): defineProperty(target, propKey, propDesc): preventExtensions(target): getPrototypeOf(target): isExtensible(target): setPrototypeOf(target, proto): construct(target, args):
特殊说明
get(target, propKey, receiver) target为目标对象;propKey操作的属性名称;receiver为proxy实例本身(严格地说,是操作行为所针对的对象)(可选) - 若属性设置为不可配置(configurable),且不可写(writable),则
Proxy不能去修改该属性的值,否则通过Proxy对象访问属性会报错。
set(target, propKey, value, receiver) receiver代表 Proxy实例本身(原始的操作行为所在的那个对象) - 严格模式下,
set代理必须返回true(有值就行),否则就会报错。
has(target, propKey),返回一个布尔值
- 拦截
propKey in target, 但是不会拦截for...in操作。 - 拦截的是
HasProperty操作,而不是HasOwnProperty操作,即不去判断是否是对象自身的属性,还是继承的属性。 - 目标对象的某个属性若不可配置
configurable或者目标对象不可扩展Object.preventExtensions(target), 则此时拦截对应的属性会报错。(不可配置,不可扩展还需详细了解)
deleteProperty(target, propKey),返回一个布尔值
- 在具体执行删除前抛出错误或者返回
false,则删除不成功。 - 目标对象的某个属性若不可配置
configurable, 则此时拦截对应的属性会报错。
apply(target, ctx, args),target此时是一个函数