跳至主要內容

22. Proxy

Harry Xiong大约 2 分钟Web 前端JavaScriptPromise 对象JS 异步async 与 await

Proxy

Proxy用于修改某些操作的默认行为,等同于在语言层面作出修改,所以属于一种"元编程",即对编程语言进行编程。Proxy可以理解为在目标对象之前设置一层拦截,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制.可以对外界的访问进行过滤和改写。proxy这个词的愿意是代理,用在这里表示它来代理某些操作,可以看作是代理器

Proxy实际上是重载了点运算符,用自己的定义覆盖了原始定义,而Proxy实际上也是一个类,通过构造函数的方式创建一个Proxy实例,该构造函数中有两个参数.一个是要拦截的目标对象,另一个参数也是一个对象,用来定制拦截的行为

var p=new Proxy(target,handle);
var obj = { a: 1, b: 2, c: 3 };
var p = new Proxy(obj, {
    get:function(target, key, receiver) {
        console.log(target);
        console.log(key);
        console.log(receiver);
        return Reflect.get(target, key, receiver);
        //return target[key];下面的代码同上方
    },
    set:function(target,key,value,receiver){
        Reflect.set(target, key, value, receiver);
        //target[key]=value;下面的代码同上方
}
});
console.log(p.a);//1
/*
{a: 1, b: 2, c: 3}
a
Proxy {a: 1, b: 2, c: 3}
*/
p.a=4;
console.log(p.a);//4
/*
{a: 4, b: 2, c: 3}
a
Proxy {a: 4, b: 2, c: 3}
*/

注意:

  • 改变Proxy实例内对象的值的时候会自动执行内部的set()方法,也能够改变传入参数对象的值,但是如果通过原对象访问的属性只会返回对应对象的值,如果通过Proxy实例访问对象属性,则会执行内部的get()方法

    var obj = { a: 1, b: 2, c: 3 };
    var p = new Proxy(obj, {
        get:function(target, key, receiver) {
            return “hello"
        },
        set:function(target,key,value,receiver){
            Reflect.set(target, key, value, receiver);
    }
    });
    p.a=4;
    console.log(obj.a);//4
    console.log(p.a);//"hello"
    console.log(p.b);//"hello"
    console.log(p.c);//"hello"
    
  • 如果Proxy构造函数的第二个参数是一个空对象,那么就没有任何拦截效果,访问proxy实例就等同于访问target

    var obj = { a: 1, b: 2, c: 3 };
    var p = new Proxy(obj, {});
    p.a=4;
    console.log(obj.a);//4
    conosole.log(p.a);//4
    

**注:**Proxy实例还可以设置很多方法,在这里值将set()与get()的用法