在我们日常生活中经常出现这种情况:租房,为了方便我们会去找中介,让他们帮我去找房子,事后我们给他一定比例的中介费就可以了,这种好处就不需要我们自己去奔波租房。同样,在程序中也有代理这种思想,当我们想在一个已有的类的方法被调用前和调用后都输出一段日志信息,而我们目前无法修改类内部的结构,但是我们可以生成一个代理对象,通过代理对象去调用目标对象的这些方法,因为目标方法会被代理对象所调用,所以在调用的前后就可以做一些我们先要加入的功能了。概念proxy也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络代理功能。一般认为代理服务有利于保障网络终端的隐私或安全,防止攻击。功能代理网络用户去取得网络信息设置用户验证和记账功能,可按用户进行记账,没有登记的用户无权通过代理服务器访问Internet网。并对用户的访问时间、访问地点、信息流量进行统计。对用户进行分级管理,设置不同用户的访问权限,对外界或内部的Internet地址进行过滤,设置不同的访问权限。增加缓冲器(Cache),提高访问速度,对经常访问的地址创建缓冲区,大大提高热门站点的访问效率。连接内网与Internet,充当防火墙(Firewall)节省IP开销调用过程调用过程主要分为 3 步:用户通过代理对象去调用业务方法,假设为 login 方法 ;代理对象会将这个操作分发给 InvocationHandler 去处理,它会去调用 invoke 方法;在 invoke 方法中通过反射去调用目标对象 target 的 login 方法,这样 target 的 login 就真正调用了,同时也可以在在目标方法被调用前后加上 log() 日志的记录。javascript es6中新增加一个新的特性,就是proxy,为了创造跟安全的枚举类型在javascript es6之前,我们想要实现枚举类型,那就是只能使用对象;但这往往是不安全,我们希望枚举值:如果不存在的话,报错。不允许动态设置,否则报错。不允许删除,否则报错。我们用一个enum的函数,来看看他在 redux 的 action types 的应用:那么,enum函数怎么写呢?很简单,只要用 Proxy 的get,set和deleteProperty钩子就行:利用apply钩子,Proxy 可以检测一个函数的调用情况。例如,用于单元测试的 spy 库。他可以获取函数的调用次数,以及调用时的参数等:
0 评论