首页 > 其他分享 >28. proxy 代理器

28. proxy 代理器

时间:2022-12-14 17:46:03浏览次数:31  
标签:target 对象 Object 28 代理 proxy 拦截

proxy 代理器

概述

Proxy可以理解为,在目标对象之前设一层"拦截",外界对该对象的访问,都必须通过这层拦截,可以对外界的访问进行过滤和改写(表示可以用它"代理"某些操作,可以翻为“代理器")。

img

语法

const proxy = new Proxy(target, handler);
||
let proxy = new Proxy(被代理的目标对象,修饰符);
// target: 目标对象,待操作对象(可以是普通对象,数组,函数,proxy实例对象)
// handler: 一个对象,最多可包含13个操作方法,也可以是空对象

为什么要用proxy代替Object.defineProperty?

1.proxy可以对一个对象的所有属性添加get和set,Object.defineProperty每个属性都需要独立的写出来

2.Object.defineProperty没有深度遍历,如果修改的是数组元素则不会触发set和get,但是proxy可以

为什么要使用Reflect这个全局对象

 Reflect 是 ES6 为了操作对象引入的 API 。Reflect主要是和Proxy配对使用的

Reflect对象有4个意义:

  • Reflect对象上可以拿到语言内部的方法。
  • 操作对象出现报错时返回false
  • 让操作对象都变为函数式编程
  • Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法

    let data = {
        name:"老王",
        age:18,
        fun:function(){
            console.log(this);
        },
        hobby:["唱","跳","rap","你干嘛"]
    }

    let proxy = new Proxy(data,{
        //set(目标对象,属性名,属性值,[代理对象])
        set:function(target,property,value){
            console.log("set");
            // target[property] = value;
            Reflect.set(target,property,value);
        },
        //get(目标对象,属性名,[代理对象])
        get:function(target,property){
            console.log("get");
            //return target[property];
            return Reflect.get(target,property);
        }
    });

    // proxy.name = "老六";
    // console.log(proxy.name);

    // proxy.age = 88;
    // console.log(proxy.age);

    data.fun();
    proxy.fun();

Proxy拦截操作(13种)

Proxy拦截操作(13种)

1.get(target[被代理的对象],propKey[属性名],receiver[proxy实例本身]):拦截对象属性的读取,比如proxy.foo或proxy['foo']。

2.set(target[被代理的对象],propKey[属性名],value[新的属性值],receiver[proxy实例本身]):拦截对象属性的设置,比如proxy.foo=v或者proxy["foo"]=v,返回一个布尔值。

3.has(target[被代理的对象],propKey[属性名]):拦截propKey in proxy操作,返回一个布尔值

4.deleteProperty(target[被代理的对象],propKey[属性名]):拦截 delete proxy[propKey]操作,返回一个布尔值.

5.ownKeys(target[被代理的对象]):拦截object.getOwnPropertyNames(proxy),Object.getOwnPropertySymbols(proxy),Object.keys(proxy),for...in循环,返回一个数组。该方法,而object.keys()的返回结果仅包括目标对象资深可遍历的属性。

6.getOwnPropertyDescriptor(target[被代理的对象],propKey[属名]):Object.getOwnPropertyDescriptor(proxy, propKey),返回属性的描述对象。

7.defineProperty(target[被代理的对象],propKey[属性名], propDesc[描述符]):拦截Object.defineProperty(proxy,propKey,propDesc)、Object.defineProperties(proxy, propDescs),返回一个布尔值。

8.preventExtensions(target[被代理的对象]):拦截Object.preventExtensions(proxy),返回一个布尔值。

9.getPrototypeOf(target[被代理的对象]):拦截Object.getPrototypeOf(proxy),返回一个对象。

10.isExtensible(target[被代理的对象]):拦截Object.isExtensible(proxy),返回一个布尔值。

11.setPrototypeOf(target[被代理的对象], proto[原型对象]):拦截Object.setPrototypeOf(proxy, proto),返回一个布尔值。如果目标对象是函数,那么还有两种额外操作可以拦截。

12.apply(target[被代理的对象], object[对象this指向], args[参数]):拦截Proxy实例作为函数调用的操作,例如:proxy(...args),proxy.call(object,...args),proxy.apply()。

13.construct(arget[被代理的对象],args[参数]):拦截Proxy实例作为构造函数调用的操作,比如new proxy(...args)。


标签:target,对象,Object,28,代理,proxy,拦截
From: https://www.cnblogs.com/qianfanqf/p/16982770.html

相关文章