Proxy
- 1. 前言
- 2. 使用
- 1. get()方法
- 2. set()方法
- ==未完待续==
1. 前言
es6中全新设计了一个叫Proxy
的类型,Proxy这个词的原意是代理,用在这里表示由它来”代理“某些操作,可以译为”代理器“,Proxy就是专门为对象设置访问代理器的,无论是读还是写都要经过代理,通过proxy就能轻松监视对象的读写过程。
2. 使用
如何使用Proxy
监视对象的读写过程呢?定义一个person
对象,对象当中有一个name
属性和height
属性,然后通过new Proxy
的方式为person
创建一个代理对象
Proxy
的构造函数需要2个参数,一个是需要代理的目标对象,另一个是代理的处理对象,在这个处理对象中可以通过get()
方法监视对象属性的访问,通过set()
方法监视对象设置属性的过程
const person={
name:'zzz',
height:185
}
const proxy=new Proxy(person,{
get(){//监视对象属性的访问
},
set(){//监视对象设置属性的过程
}
})
1. get()方法
get()方法可以接收两个参数,第一个是代理的目标对象,第二个是访问的属性名,分别把它们打印出来
const proxy=new Proxy(person,{
get(target,property){// 目标对象 访问的属性名
console.log(target,property);
},
set(){
}
})
console.log(proxy.name);
get()
方法正常的逻辑应该是判断代理目标对象中是否存在访问的属性名,存在就返回对应的值,不存在就返回undefined
或者一个默认值
get(target,property){
return property in target? target[property]:'default'
},
//分别打印存在的属性和不存在的属性
console.log(proxy.name); //zzz
console.log(proxy.age); //default
2. set()方法
set()
方法接收三个参数,第一个是代理的目标对象,第二个是要写入的属性名,第三个是要写入的属性值,分别在方法里将这三个参数打印出来并在外边添加一个属性
set(target,property,value){
console.log(target,property,value);
}
proxy.sex='男'
控制台就会打印出写入的属性和属性值
set()
方法正常的逻辑应该是为代理目标设置指定属性,在设置之前先做一些数据校验,例如属性名为height,那么那么就要判断它的是否是一个数字,不是就抛出错误
set(target,property,value){
if(property === 'height'){ //判断属性名是否为height
if(!Number.isInteger(value)){//判断是否为整数
throw new TypeError(`${value} is not an int`)
}
}
target[property]=value
}