Proxy 代理

简介: Proxy 代理



基本认知


在 ES6 标准中新增的一个非常强大的功能是 Proxy,它可以自定义一些常用行为如查找、赋值、枚举、函数调用等。通过 Proxy 这个名称也可以看出来它包含了“代理”的含义,只要有“代理”的诉求都可以考虑使用 Proxy 来实现。


语法:


let p = new Proxy(target, handler)


参数:

参数

含义

必选

target

用proxy包装的目标对象(可是任何类型的对象,包括原生数组,函数,甚至是另一个代理)

Y

handler

一个对象,其属性是当执行一个操作时定义代理的行为的函数

Y


简单的使用场景:

我们经常读取一个对象的 key-value:


let o = {

   name:'xicheng',

   age:23

}


let handler = {

 get(obj, key) {

   return Reflect.has(obj, key) ? obj[key] : ''

 }

}


let p = new Proxy(o, handler)


console.log(p.name) //xicheng

console.log(p.xx)   //''


这个代码是想表达如果 o 对象有这个 key-value 则直接返回,如果没有一律返回 '',当然这里是自定义,可以根据自己的需要来写适合自己业务的规则。


写操作拦截


场景:指写数据不可写


let o = {

   name:'xicheng',

   age:23

}


let handler = {

 get(obj, key) {

   return Reflect.has(obj, key) ? obj[key] : ''

 },

 set(obj, key ,value) {

   return false;   //对数据的“写操作”进行了拦截

 }

}


let p = new Proxy(o, handler)


console.log(p.name) //xicheng

console.log(p.xx)   //''


es5类似锁定写操作:


let 0 = {

   name:'xicheng',

   age:23

}

for( let [key] of Object.entries(o)){   //es6可以使用Reflect

   Object.defineProperty(o,key,{

       writable:false;

   })

}


相较Proxy来说,这种方法过于死板,是将原数据给直接锁写了.


较验的应用


let o = {

   name:'xicheng',

   age:23

}


let validator = (obj, key ,value) => {

   if(Reflect.has(obj,key)){

       if(key == 'price'){

           if(value > 300) {

               return false;

           } else {

               obj[key] = value

           }

       } else {

           obj[key] = value

       }

   } else {

       return false

   }

}


let handler = {

 get(obj, key) {

   return obj[key] || ''

 },

 set:validator

}

let p = new Proxy(o, handler)


监控上报


//监听错误

window.addEventListener('error',(e) => {

   console.log(e.message)

   //可以加入上报逻辑

},true)


let 0 = {

   name:'xicheng',

   age:23

}


let validator = (obj, key ,value) => {

   if(Reflect.has(obj,key)){

       if(key == 'price'){

           if(value > 300) {

           //规则不满足,则触发错误

               throw new TypeError('price exceed 300')

               //return false;

           } else {

               obj[key] = value

           }

       } else {

           obj[key] = value

       }

   } else {

       return false

   }

}


let handler = {

 get(obj, key) {

   return obj[key] || ''

 },

 set:validator

}

let p = new Proxy(o, handler)


只读随机唯一id


class Component {

   //constructor () {  //错误方案一

   //    this.id = Math.random().toString(36).slice(-8)

   //}

   

   //get id(){ //错误方案二

   //    return Math.random().toString(36).slice(-8)

   //}

   

   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 = 'abc'


console.log(com.id,com2.id)


撤消代理


let 0 = {

   name:'xicheng',

   age:23

}


let handler = {

 get(obj, key) {

   return Reflect.has(obj, key) ? obj[key] : ''

 }

}


let p = Proxy.revocable(o, handler)


console.log(p.proxy.name) //xicheng

console.log(p.proxy.xx)   //''

console.log(p)  // {proxy:Proxy,revoke:f}


//撤消代理:

p.revoke();


//代理已被撤消

console.log(p.name) // Uncaught TypeError: Cannot perform 'get' on a proxy that has been revoke at eval


一旦 revoke 被调用,proxy 就失效了,这也就起到了“临时”代理的作用


参考资料



更多


目录
相关文章
|
2月前
|
安全 数据安全/隐私保护
Burpsuite Proxy代理功能
Burpsuite Proxy代理功能
|
7月前
|
网络协议 安全 数据安全/隐私保护
Socks5代理和HTTP代理的区别在哪里?
Socks5和HTTP代理是两种IP代理方式,分别基于Socks5及HTTP协议。Socks5支持TCP/UDP,适合P2P、游戏和流媒体,提供传输层身份验证。HTTP代理仅支持HTTP,适用于Web浏览控制和内容过滤。选择代理应根据实际需求,如需高速低延迟选Socks5,需访问控制选HTTP。
|
7月前
|
监控 JavaScript 前端开发
|
7月前
|
Python
proxy配置
proxy配置
|
缓存 监控 负载均衡
http代理(proxy)配置都有哪些方法?
今天我将和大家探讨关于HTTP proxy配置的不同方法。在网络通信中,HTTP proxy配置(或称为IP代理)起着重要的作用,它允许我们在客户端和服务器之间建立中间代理,从而实现匿名性、访问控制和性能优化等目的。
|
7月前
|
缓存 安全 网络协议
什么是 Proxy?
什么是 Proxy?
302 0
|
7月前
|
数据采集 网络协议 安全
http代理ip和socks代理ip有什么区别?哪个好?
HTTP(HyperText Transfer Protocol)即超文本传输协议。是Internet上行信息传输时使用最为广泛的一种非常简单的网络协议。Socks是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递。
|
7月前
|
JavaScript 前端开发
什么是Proxy?
什么是Proxy?
170 0
|
自然语言处理 监控 JavaScript
什么是proxy?
什么是proxy?
80 0
Proxy代理数据拦截方法
**Proxy** 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。
185 0
Proxy代理数据拦截方法

热门文章

最新文章