老韩哥

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

{
// Proxy 代理

let obj={
time:'2020-05-01',
name:'laohan',
_id:123
}

let monitor = new Proxy(obj,{
// 拦截对象属性的读取
get(target,key){
return target[key].replace('2021','2020')
},
// 拦截对象设置属性
set(target,key,value){
if(key==='name'){
return target[key]=value
}else{
return target[key]
}
},
// 拦截 key in object操作
has(target,key){
if(key==='name'){
return target[key]
}else{
return false
}
},
// 拦截delete
deleteProperty(target,key){
if(key.indexOf('_')>-1){
delete target[key]
return true
}else{
return target[key]
}
},
// 拦截Object.keys,Object.getOwnPropertySymbols,Object.getOwnPropertyNames
ownKeys(target){
return Object.keys(target).filter(item=>item!='time')
}


})

console.log('get',monitor.time)
monitor.time='2022'
monitor.name='seven'
console.log('set',monitor)
console.log('has','name' in monitor,'time' in monitor)

// delete monitor.time
// console.log('delete',monitor)

// delete monitor._id
// console.log('delete',monitor)

console.log('ownKeys',Object.keys(monitor))

}

{
// Reflect 反射
let obj={
time:'2020-05-01',
name:'laohan',
_id:123
}

console.log('reflect get',Reflect.get(obj,'time'))
Reflect.set(obj,'name','xiaoHan')
console.log('reflect set',obj)

console.log('reflect has',Reflect.has(obj,'name'))


}

{
function validator(target,validator) {
return new Proxy(target,{
_validator:validator,
set(target,key,value,proxy){
if(target,hasOwnProperty(key)){
let va=this._validator[key]
if(!!va(value)){
return Reflect.set(target,key,value,proxy)
}else{
throw Error(`不能设置${key}到${value}`)
}
}else{
throw Error('${key} 不存在')
}
}
})
}

const personValidators={
name(val){
return typeof val==='string'
},

age(val){
return typeof val==='number' && val>18
}
}

class Person{
constructor(name,age){
this.name=name
this.age=age
return validator(this,personValidators)
}
}

const person = new Person('lilei',30)

console.info(person)

person.age=30;
console.info(person)

}

 

posted on 2020-05-01 21:47  老韩哥  阅读(157)  评论(0)    收藏  举报