Proxy
本系列属于阮一峰老师所著的ECMAScript 6 入门学习笔记
概述
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.fooset(target,propKey,value,reveiver):拦截对象属性的设置,返回一个布尔值,如proxy.foo = vhas(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)

浙公网安备 33010602011771号