//场景一:可以修改对象的值let o = { name: 'xiaoming', price: 190 } let d = new Proxy(o,{ get (target,key){ if(key === 'price'){ return target[key] + 20 }else{ return target[key] } } }) console.log(d.price,d.name)
//场景二:不修改其代理的值,只读 let o = { name: 'xiaoming', price : 190 } let d = new Proxy(o,{ get (target,key) { return target[key] }, set (target, key, value) { return false } }) d.price = 300 console.log(d.price,d.name) //es5实现只读,缺点:客户和程序员都不能修改 for(let [key] of Object.entries(o)) { Object.defineProperty(o,key,{ writable: false }) } o.price = 300 console.log(d.price,d.name)
//场景三:不破坏数据接口,符合校验规则
1 let o = { 2 name: 'xiaoming', 3 price : 190 4 } 5 let validator = (target, key, value) => { 6 if(Reflect.has(target,key)) { 7 if(key === 'price') { 8 if(value > 300) { 9 return false 10 }else { 11 target[key] = value 12 } 13 }else { 14 target[key] = value 15 } 16 }else{ 17 return false 18 } 19 } 20 let d = new Proxy(o, { 21 get (target, key) { 22 return target[key] || ' ' 23 }, 24 set: validator 25 }) 26 d.price = 203 27 d.name = 'heiei' 28 d.age = 30 29 console.log(d.price,d.name, d.age)//场景4:生成随机编码,只读class Component { constructor () { this.proxy = new Proxy({ id: Math.random().toString(36).slice(-8) },{}) } get id() { return this.proxy.id }}let com = new Component()let com2 = new Component()for(let i = 0; i < 10; i++){ console.log(com.id,com2.id)}com.id = '123'console.log(com.id,com2.id)//场景5:如何撤销代理
let o = { name: 'xiaoming', price : 190 }let d = Proxy.revocable(o, { get (target, key) { if(key === 'price') { return target[key] + 20 }else { return target[key] } }})console.log(d.proxy.price, d)setTimeout(function () { d.revoke() setTimeout(function () { console.log(d.proxy.price) },100)},1000)
来源:https://www.cnblogs.com/qjb2404/p/12220931.html