1. 概述
ES6原生提供Proxy构造函数,用来生成Proxy实例。
var proxy = new Proxy(target, handler);
Proxy 对象的所有用法,都是上边这种形式,不同的是handler参数的写法。new Proxy()表示生成一个Proxy实例,target参数表示所要拦截的目标对象,handler参数也可以是一个对象,用来定制拦截行为。
2. Proxy 实例的方法
2.1 get()
get(target, propKey, receiver)
:拦截对象属性的读取
,比如proxy.foo和proxy[‘foo’]。
三个参数:目标对象、属性名、proxy实例本身(可选)
小栗子:
var person = {
name: "张三"
};
var proxy = new Proxy(person, {
get: function(target, propKey) {
if (propKey in target) {
return target[propKey];
} else {
throw new ReferenceError("Prop name \"" + propKey + "\" does not exist.");
}
}
});
proxy.name // "张三"
proxy.age // 抛出一个错误
上述代码,访问目标对象不存在的属性,会抛出一个错误。如果没有拦截函数,访问不存在的属性,只会返回undefined。
2.2 set()
set(target, propKey, value, receiver)
:拦截对象属性的设置
,比如proxy.foo = v或proxy[‘foo’] = v,返回一个布尔值
。
2.3 apply()
apply(target, object, args)
:拦截 Proxy 实例作为函数调用的操作,比如proxy(...args)
、proxy.call(object, ...args)
、proxy.apply(...)
。
2.4 has()
has(target, propKey)
:拦截propKey in proxy
的操作,返回一个布尔值
。
2.5 construct()
construct(target, args)
:拦截 Proxy 实例作为构造函数调用的操作,比如new proxy(...args)
。