Proxy用法
Proxy用法,数据劫持,与
Object.defineProperty()
一样,Proxy更好用
相当于在obj外面再加一层
,加一层的话首先是与原对象解耦
,其次是不破坏原对象,以后直接用Proxy对象就行。
// Proxy的初体验:
let obj = {};
let myProxy = new Proxy(obj,{
get(){
console.log('执行了get方法')
},
set(){
console.log('执行了set方法')
}
});
// 注意:这个与Object.defineProperty()的调用不一样。这个需要用myProxy对象调用。
myProxy.testAttr = '1111'
myProxy.testAttr
// Proxy中最常用的两个方法:get与set方法的使用
let obj2 = {};
let myProxy2 = new Proxy(obj2,{
get(target,key){
console.log('get',target[key])
return target[key]
},
//注意:target是当前对象,key是属性名,value是属性值。例如 obj2.name = 'flx',targrt是obj2; name是key; flx是value
set(target,key,value){
target[key] = value
}
});
myProxy2.name = 'CXY'
console.log(myProxy2.name)
Reflect用法
Reflect的使用:用于
获取对象(例如Array、Set对象、Object对象等等)
的默认行为(本身自己带的方法)
。最常用的是与Proxy一起使用。
我对Reflect的个人理解,就是反射,比如
const obj = {}
。这个时候,我们的obj有了自己的属性与方法
,也继承了父类Object
的,Reflect就是通过反射,获取到这个大对象的所有属性与方法
。
举个例子:
// 不使用Reflect
const arr0 = [1,2,3,4];
const myProxy0 = new Proxy(arr0,{
get(target,key){
console.log('myProxy0','get方法执行了')
// 改变this指向,使this指向Array而不是myProxy0
if(target[key] instanceof Function){
return target[key].bind(target)
}
return target[key]
},
set(target,key,value){
console.log('myProxy0','set方法执行了')
target[key] = value
}
})
myProxy0.push(5)
console.log(myProxy0)
// 使用Reflect
const arr = [1,2,3,4];
const myProxy3 = new Proxy(arr,{
// 注意:通过Reflect.get(),获取到arr大对象的方法。也就是Array的各种方法 push() shfit() 等等。这个时候。肯定不用改变this指向。获取的就是Array的。
get(target,key){
console.log('myProxy3','get方法执行了')
return Reflect.get(target,key)
},
set(target,key,value){
console.log('myProxy3','set方法执行了')
return Reflect.set(target,key,value)
}
})
myProxy3.push(5)
console.log(myProxy3)