概述
proxy 意为代理,在目标对象之前设置一层拦截。当直接访问
proxy
的对象,没有啥问题。当访问被代理的对象,其实是从proxy
那里拿答案
基础使用
var person = {
name: 'yf'
}
var proxy = new Proxy(person,{
get: function (target,property) {
if (property in target) {
return target[property];
}else {
throw new ReferenceError("Property \" "+property + "\" does not exist.");
}
}
});
proxy.name // yf
proxy.age // 报错
注意点
- 当
Proxy
的第二个参数为{}
,那么proxy
对象直达代理对象 - 当属性不可读和不可配置时,使用
proxy
代理报错
可代理方法
下面时可以代理的方法,但是参数各有不同。同时可能涉及到
Reflect
get(target,propKey,receiver)
set(target,propKey,value,receiver)
has(target,propKey)
deleteProperty(target,propkey)
ownKeys(target)
getOwnPropertyDescriptor(target,propKey)
defineProperty(target, propKey, propDesc)
preventExtensions(target)
getPrototypeOf(target)
isExtensible(target)
setPrototypeOf(target, proto)
apply(target, object, args)
construct(target, args)
this
在Proxy代理的情况下,目标对象内部的this指向proxy代理
const target = {
m: function () {
console.log(this === proxy);
}
};
const handler = {};
const proxy = new Proxy(target,handler);
target.m() // false
prox.m() // true