本系列属于阮一峰老师所著的学习笔记
概述
Proxy
原意是代理,可以理解为”代理器“。Proxy
用于修改某些操作的默认行为,等同于在语言层面做出修改,属于一种”元编程“(meta programming),即对编程语言进行编程。
var obj = new Proxy({},{ get: function(target,key,receiver){ console.log(`getting ${key}!`) return Reflect.get(target,key,receiver) }, set: function(target,key,value,receiver){ console.log(`setting ${key}!`) return Reflect.set(target,key,value,receiver) }})obj.count = 1 // setting count!++obj.count // getting count! settting count!// Proxy构造函数,用来生成Proxy实例var proxy = new Proxy(target,handler) // target表示拦截的目标对象,handle参数也是一个对象,用来定制拦截行为// 设置object.proxy属性,在object对象上调用var object = {proxy: new Proxy(target,handler)}// 作为对象的原型对象调用var proxy = new Proxy({},{ get: function(target,property){ return 35 }})let obj = Object.create(proxy)obj.time // 35
Proxy
拦截操作方法一共13种:
get(target,propKey,receiver)
:拦截对象属性的读取,如proxy.foo
set(target,propKey,value,reveiver)
:拦截对象属性的设置,返回一个布尔值,如proxy.foo = v
has(target,propKey)
:拦截propKey in proxy
的操作,返回一个布尔值deleteProperty(target,propKey)
:拦截delete proxy[propKey]
操作,返回一个布尔值ownKeys(target)
:拦截Object.getOwnPropertyNames(proxy)
、Object.getOwnPropertySymbols(proxy)
、Object.keys(proxy)
,返回一个数组。该方法返回目标对象所有自身属性的属性名,而Obejct.keys()
的返回结果仅包括目标对象自身的可遍历属性getOwnPropertyDescroptor(target,propKey)
:拦截Object.getOwnPropertyDescriptor(proxy,propKey)
,返回属性的描述对象defineproperty(target,propKey,propDesc)
:拦截Object.defineProperty(proxy,propKey,propDesc)
、Object.defineProperties(proxy,propDescs)
,返回一个布尔值preventExtensions(target)
:拦截Object.preventExtensions(proxy)
, 返回一个布尔值getPrototypeOf(target)
:拦截Object.getPrototype(proxy)
,返回一个对象isExtensible(target)
:拦截Object.isExtensible(proxy)
,返回一个布尔值setPrototypeOf(target,proto)
:拦截Object.setPrototypeOf(proxy,proto)
,返回一个布尔值,如果目标对象是函数,那么还有两种额外操作可以拦截。apply(target,object,args)
:拦截Proxy实例作为函数调用的操作,比如proxy(...args)
、proxy.call(objcet,...args)
、proxy.apply(...)
construct(target,args)
:拦截Proxy实例作为构造函数调用的操作,比如proxy(...args)