Proxy代理器
Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。
Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。
var obj = new Proxy({}, { get: function (target, propKey, receiver) { console.log(`getting ${propKey}!`); return Reflect.get(target, propKey, receiver); }, set: function (target, propKey, value, receiver) { console.log(`setting ${propKey}!`); return Reflect.set(target, propKey, value, receiver); } });
重定义了属性的读取(get
)和设置(set
)行为。Proxy 实际上重载(overload)了点运算符,即用自己的定义覆盖了语言的原始定义。
var proxy = new Proxy(target, handler);
target为拦截的目标对象,handler参数也是一个对象,用来定制拦截行为。如果handler
没有设置任何拦截,那就等同于直接通向原对象。
要使得Proxy
起作用,必须针对Proxy
实例进行操作,而不是针对目标对象进行操作。
一个技巧是将 Proxy 对象,设置到object.proxy
属性,从而可以在object
对象上调用。
var object = { proxy: new Proxy(target, handler) };
Proxy 实例也可以作为其他对象的原型对象。
var proxy = new Proxy({}, { get: function(target, propKey) { return 35; } }); let obj = Object.create(proxy); obj.time // 35