zoukankan      html  css  js  c++  java
  • proxy [ˈprɒksi] 代理

    谷歌、QQ支持,360、搜狗不支持

    使用proxy代理可以实现,对原先的类不进行处理,新建一个类,对此进行拦截处理,以实现低耦合

    可以通过代理拦截的方法,将方法进行重写。

    //--------------例1--------------

    let obj = {
      webName: '百度',
      url: 'www.baidu.com'
    }
    
    let p = new Proxy(obj,{
      get: function(target,key){
        return target[key]
      },
    
      set: function(target,key,value){
        target[key] = value
      }
    });
    
    p.webName = 'baidu';
    console.log(p.webName);

    //------------例2-------------

    Proxy实际上重载(overload)了点运算符

    var proxy = new Proxy(target,handler);
    
    class Register{ // 定义一个类
      constructor(){
        this.prefix = '';
        this.name = '';
        console.log('构造完成');
      }
    }
    
    let obj = new Register();  // 使用new方法新建一个类
    
    let p = new Proxy(obj,{    // 定义一个代理,起到拦截作用  将使用new方法创建的类使用Proxy代理
      get: function(target,key){
        return target[key];
      },
    
      set: function(target,key,value){
        if(key == 'id' && value == 15){
          target['prefix'] = '此人是逃犯';
        }
    
        target[key] = value;
    
        if(key == 'name'){
          value = target[key] + ',' + target['prefix'];
        }
    
        return Reflect.set(target,key,value);  // 调用反射,当set全部结束,输出的时候会调动get方法
      }
    });
    
    p.id = 1;   // . 会自动调用get和set方法
    
    p.name = '张三';  // 相当于 调用set
    
    console.log(p.name);
    
    p.id = 15;
    
    p.name = '李四';
    
    console.log(p.name);

    实例:

    //-----------------------------------

    Proxy对象方法列表:

     方法                                                          描述

    handler.apply()                       拦截Proxy实例作为函数调用的操作

    handler.construct()                 拦截Proxy实例作为构造函数调用的操作

    handler.defineProperty()          拦截Object.defineProperty操作

    handler.deleteProperty()          拦截delete删除属性操作

    handler.enumerate()               此方法将被废弃,不建议使用

    handler.get()                          拦截属性的读取操作

    handler.getOwnPropertyDescriptor()  拦截Object.getOwnPropertyDescriptor()操作

    handler.getPrototypeOf()          拦截获取原型对象操作

    handler.has()                          拦截属性检索操作

    handler.isExtensible()              拦截Object.isExtensible()操作

    handler.ownKeys()                  拦截Object.getOwnPropertyNames()操作

    handler.preventExtensions()     拦截Object.preventExtensions()操作

    handler.set()                          拦截属性赋值操作

    handler.setPrototypeOf()         拦截Object.setPrototypeOf()操作

    Proxy.revocable()                    创建一个可取消的Proxy实例

  • 相关阅读:
    接口和抽象的区别
    接口
    jquery Ajax提交表单数据
    SQL 检查 是否存在 表 临时表
    ASP.NET MVC 设置Area中 Controller 的方法 默认启动页
    json 序列化为数组
    C# Lamda中类似于SQL 中的 In 功能
    各种webservice调用地址
    ASP.NET获取客户端IP地址
    C#反射机制 Type类型
  • 原文地址:https://www.cnblogs.com/crazycode2/p/6668291.html
Copyright © 2011-2022 走看看