Proxy-Reflect的学习
监听对象属性的操作一
const obj = {
name: 'Fhup',
age: 18
}
Object.keys(obj).forEach(item => {
let value = obj[item]
Object.defineProperty(obj, item, {
configurable: true,
enumerable: true,
get() {
console.log(`监听${item}获取值~`);
return value
},
set(newValue) {
console.log(`监听${item}设置值~`);
value = newValue
}
})
})
obj.name = '123'
obj.age = 3
console.log(obj.name);
console.log(obj.age);
Proxy监听对象属性操作二
const obj = {
name: 'Fhup',
age: 18
}
const objProxy = new Proxy(obj, {
get(target, key) {
console.log(`获取obj的${key}~`);
return target[key]
},
set(target, key, newValue) {
console.log(`设置obj的${key}~`);
target[key] = newValue
}
})
console.log(objProxy.name);
console.log(objProxy.age);
objProxy.name = 'xxx'
objProxy.age = 3
console.log(obj);
console.log(objProxy);
Proxy其他的捕获器
let obj = {
name: 'Fhup',
age: 18
}
const objProxy = new Proxy(obj, {
set(target, key, newValue){
console.log('设置值')
target[key] = newValue
},
get(target, key){
console.log('获取值')
return target[key]
},
has(target, key) {
console.log('监听in操作')
return key in target
},
deleteProperty(target, key){
console.log('监听delete操作');
delete target[key]
}
})
console.log('age' in objProxy)
delete objProxy.age
console.log(obj)
Proxy对函数对象的监听
function foo() {
}
let fooProxy = new Proxy(foo, {
apply(target, thisArg, argArray) {
console.log('apply调用~');
return target.apply(thisArg, argArray)
},
construct(target, argArray, newTarget) {
console.log('new调用~');
return new target(...argArray)
}
})
new fooProxy()
fooProxy.apply(this,[])
Reflect和Proxy的结合使用
const obj = {
name: 'Fhup',
age: 18
}
const objProxy = new Proxy(obj, {
set(target, key, newValue){
console.log('设置值~');
Reflect.set(target, key, newValue)
},
get(target, key){
console.log('获取值~');
return Reflect.get(target, key)
}
})
objProxy.name = 'xxx'
objProxy.age = 3
console.log(objProxy.name)
console.log(objProxy.age)
console.log(objProxy)
console.log(obj)
捕获器中receiver参数
const obj = {
_name: 'Fhup',
get name() {
return this._name
},
set name(newValue) {
this._name = newValue
}
}
const objProxy = new Proxy(obj, {
get(target, key, receiver) {
console.log('获取------', key, receiver, receiver === objProxy)
return Reflect.get(target, key, receiver)
},
set(target, key, newValue, receiver) {
console.log('设置------', key);
Reflect.set(target, key, newValue, receiver)
}
})
objProxy.name = 'xxx'
console.log(objProxy.name)
Reflect中construct作用
function Student(name, age) {
this.name = name
this.age = age
}
function Teacher() {
}
const teacher = Reflect.construct(Student, ['Fhup', 18], Teacher)
console.log(teacher)
console.log(teacher.__proto__ === Teacher.prototype)