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实例

原文地址:https://www.cnblogs.com/crazycode2/p/6668291.html