美文网首页
32-Proxy(代理)

32-Proxy(代理)

作者: 早起的鸟儿 | 来源:发表于2019-11-05 15:31 被阅读0次

一、什么是Proxy
官方解释:Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。
Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。

比如说生活中很常见的有代理商,对某品牌衣服做了代理,然后买家通过代理去买衣服而不是直接和厂家买,这就是proxy。

二、使用
Proxy提供一些方法来进行拦截
(1)get(target, propKey, receiver):拦截对象属性的读取

{
    let obj = {
        name:"衣服",
        time:"2018-1-1",
        desc:"质量还行"
    }
    let presonZ = new Proxy(obj,{  //obj是原对象(也就是衣服厂商)
        //get(){}    //全部拦截用户的获取
        get(target,key){  //target对象 key属性名
            if(key == "time") {  //判断拦截time属性读取
                return false
            }else{
                return target[key]
            }
        }
    })
    console.log(presonZ.name)  //衣服  用户操作
    console.log(presonZ.time)  //false 
}

(2)set(target, propKey, value, receiver)

拦截对象属性的设置,比如proxy.foo = v或proxy['foo'] = v,返回一个布尔值。返回ture是可以修改(拦截失败),返回false不可以修改(拦截成功)

let presonZ = new Proxy(obj, {
    set(target, key, val) {
        if (key == "name") {   //拦截成功 不可以修改的
            return target[key];
            // return false;  //可以return false 但是是提示报错,也可以直接返回值
        } else {   //可以修改
            target[key] = val;  
            return true
        }
    }
})
presonZ.name = "皮袄";
console.log(presonZ.name);   //永远都是衣服

presonZ.desc="修改成功";
console.log(presonZ.desc);  //修改成功

presonZ.time = "2011-1-1"; 
console.log(presonZ.time);    //2011-1-1

(3)deleteProperty(target, propKey)

拦截delete proxy[propKey]的操作,返回一个布尔值。

//delete
let presonZ = new Proxy(obj,{
    deleteProperty(target, propKey){
        if(propKey == 'name') {
            return target[propKey]
        }else{
            delete target[propKey];
            return true
        }
    }
})
// delete(presonZ.name);  //删除name属性
delete(presonZ.name);   ///name属性依然在

delete(presonZ.desc)   //删除成功
console.log(presonZ)    //Proxy {name: "衣服", time: "2018-1-1"}

更多方法参考:http://caibaojian.com/es6/proxy.html

相关文章

  • 正向代理和反向代理(通俗易懂)

    正向代理:代理端代理的是客户端。反向代理:代理端代理的是服务端。 常用案例 正向代理:如VPN代理客户端 反向代理...

  • 编程常用的设计模式

    动态代理和静态代理 静态代理 动态代理 静态代理与动态代理的区别 JDK中的动态代理和CGLIB 实现动态代理的方...

  • JAVA动态代理的实现方式

    1. 静态代理VS动态代理 代理类可以增强被代理对象的方法。可分为静态代理和动态代理。 1.1 静态代理 静态代理...

  • 面试系列~动态代理实现与原理

    动态代理有JDK动态代理, CGLIB动态代理, SpringAOP动态代理 一,JDK动态代理  jdk动态代理...

  • Nginx作为代理服务

    一、代理服务代理-代为办理(代理理财、代理收货等等) 1.1正向代理 1.2反向代理 1.3代理区别 1.4配置语...

  • Spring之代理模式

    九、代理模式 目录:静态代理、动态代理AOP的底层机制就是动态代理。代理模式分为静态代理和动态代理。接触aop之前...

  • Spring的AOP原理分析

    一 动态代理 动态代理分为JDK动态代理和CGLIB动态代理 jdk动态代理 被代理类(目标类)和代理类必须实现同...

  • 静态代理、动态代理

    代理分为静态代理和动态代理 按照代理创建的时期,可以分为静态代理和动态代理: (1) 静态代理:由程序员或者...

  • Java 代理的实现原理

    一、怎样使用代理 二、代理实现的原理 一、代理分为静态代理和动态代理 静态代理:代理对象获得目标对象的引用 动态代...

  • spring aop

    JDK动态代理和CGLib代理 JDK的代理代理类 被代理接口 被代理实现类 启动类: jdk的动态代理是针对接口...

网友评论

      本文标题:32-Proxy(代理)

      本文链接:https://www.haomeiwen.com/subject/toncmctx.html