proxy 代理器
概述
Proxy可以理解为,在目标对象之前设一层"拦截",外界对该对象的访问,都必须通过这层拦截,可以对外界的访问进行过滤和改写(表示可以用它"代理"某些操作,可以翻为“代理器")。
语法
const proxy = new Proxy(target, handler);
||
let proxy = new Proxy(被代理的目标对象,修饰符);
// target: 目标对象,待操作对象(可以是普通对象,数组,函数,proxy实例对象)
// handler: 一个对象,最多可包含13个操作方法,也可以是空对象
为什么要用proxy
代替Object.defineProperty
?
1.proxy
可以对一个对象的所有属性添加get和set,Object.defineProperty
每个属性都需要独立的写出来
2.Object.defineProperty
没有深度遍历,如果修改的是数组元素则不会触发set和get,但是proxy可以
为什么要使用Reflect这个全局对象
Reflect 是 ES6 为了操作对象引入的 API 。Reflect主要是和Proxy配对使用的
Reflect对象有4个意义:
- 从
Reflect
对象上可以拿到语言内部的方法。 - 操作对象出现报错时返回false
- 让操作对象都变为函数式编程
Reflect
对象的方法与Proxy
对象的方法一一对应,只要是Proxy
对象的方法,就能在Reflect
对象上找到对应的方法
let data = {
name:"老王",
age:18,
fun:function(){
console.log(this);
},
hobby:["唱","跳","rap","你干嘛"]
}
let proxy = new Proxy(data,{
//set(目标对象,属性名,属性值,[代理对象])
set:function(target,property,value){
console.log("set");
// target[property] = value;
Reflect.set(target,property,value);
},
//get(目标对象,属性名,[代理对象])
get:function(target,property){
console.log("get");
//return target[property];
return Reflect.get(target,property);
}
});
// proxy.name = "老六";
// console.log(proxy.name);
// proxy.age = 88;
// console.log(proxy.age);
data.fun();
proxy.fun();
Proxy拦截操作(13种)
Proxy拦截操作(13种)
1.get(target[被代理的对象],propKey[属性名],receiver[proxy实例本身]):拦截对象属性的读取,比如proxy.foo或proxy['foo']。
2.set(target[被代理的对象],propKey[属性名],value[新的属性值],receiver[proxy实例本身]):拦截对象属性的设置,比如proxy.foo=v或者proxy["foo"]=v,返回一个布尔值。
3.has(target[被代理的对象],propKey[属性名]):拦截propKey in proxy操作,返回一个布尔值
4.deleteProperty(target[被代理的对象],propKey[属性名]):拦截 delete proxy[propKey]操作,返回一个布尔值.
5.ownKeys(target[被代理的对象]):拦截object.getOwnPropertyNames(proxy),Object.getOwnPropertySymbols(proxy),Object.keys(proxy),for...in循环,返回一个数组。该方法,而object.keys()的返回结果仅包括目标对象资深可遍历的属性。
6.getOwnPropertyDescriptor(target[被代理的对象],propKey[属名]):Object.getOwnPropertyDescriptor(proxy, propKey),返回属性的描述对象。
7.defineProperty(target[被代理的对象],propKey[属性名], propDesc[描述符]):拦截Object.defineProperty(proxy,propKey,propDesc)、Object.defineProperties(proxy, propDescs),返回一个布尔值。
8.preventExtensions(target[被代理的对象]):拦截Object.preventExtensions(proxy),返回一个布尔值。
9.getPrototypeOf(target[被代理的对象]):拦截Object.getPrototypeOf(proxy),返回一个对象。
10.isExtensible(target[被代理的对象]):拦截Object.isExtensible(proxy),返回一个布尔值。
11.setPrototypeOf(target[被代理的对象], proto[原型对象]):拦截Object.setPrototypeOf(proxy, proto),返回一个布尔值。如果目标对象是函数,那么还有两种额外操作可以拦截。
12.apply(target[被代理的对象], object[对象this指向], args[参数]):拦截Proxy实例作为函数调用的操作,例如:proxy(...args),proxy.call(object,...args),proxy.apply()。
13.construct(arget[被代理的对象],args[参数]):拦截Proxy实例作为构造函数调用的操作,比如new proxy(...args)。
标签:target,对象,Object,28,代理,proxy,拦截
From: https://www.cnblogs.com/qianfanqf/p/16982770.html