proxy,Reflect
//Proxy 代理对象 为对象设置访问代理器
//Object.defineProperty //只能监测读写
const person={
name:'tom',
age:20
}
const personProxy=new Proxy(person,//需要代理的目标对象
{//代理的处理对象
get(target,property){//监视对象的访问
//1.代理的目标对象 2.外部访问的属性名
return property in target ? target[property] : 'default'
},
set(target,property,value){//监视对象的设置
//1.代理的对象 2.要改变 写入的属性名 3.写入的值
//写入之前做校验
if(property==='age'){
if(!Number.isInteger(value)){//确定传递的参数是否为整数
throw new TypeError(`${value} is not an int`)
}
}
target[property]=value
},
deleteProperty(target,property){
delete target[property]
}
}
)
console.log(personProxy.age=10)
console.log(personProxy.name)
delete personProxy.age
console.log(person)
//支持数组对象的监测
const list=[]
const listProxy=new Proxy(list,{
set(target,property,value){
console.log('set',property,value)
return target[property]=value
}
})
listProxy.push(100)
listProxy.push(200)
console.log(list) //[100,200]
reflect属于一个静态类 封装了对对象的底层操作
统一了操作对象的api
const obj={
foo:'123',
bar:'456'
}
const proxy=new Proxy(obj,{
//没有定义get方法 等同于定义了一个get方法 将参数交给reflect的get方法
get(target,property){
return Reflect.get(target,property)
}
})
const obj={
name:'foo',
age:18
}
//target是否为object
Reflect.getPrototypeOf(obj) //Object.prototype
// 判断一个对象是否可扩展 (即是否能够添加新的属性)
Reflect.isExtensible(obj) //true
//方法阻止新属性添加到对象
Reflect.preventExtensions(obj) //返回true 设置成功
//判断是否存在某个属性
Reflect.has(obj,'name') //true
//获取对象中的所有属性
Reflect.ownKeys(obj) //['name’,‘age']
//为对象添加一个新的属性
Reflect.set(obj,'eye','block') //设置成功返回true
//获取对象的值
Reflect.get(obj,'name')//foo
//获取对象中的属性及属性描述
console.log(Reflect.getOwnPropertyDescriptor(obj,'name')) //{ value: 'foo', writable: true, enumerable: true, configurable: true }
//删除某个属性
Reflect.deleteProperty(obj,'age')