ES6中Proxy

news/2024/7/24 9:40:06 标签: es6, 前端, javascript

1. Proxy

说明:Proxy可以理解成在目标对象架设一层拦截器,外界访问内部的变量都必须经过这一层,可以对外界的访问进行过滤和改写。

1.1例子:

javascript"> const proxy=new Proxy(target,handler)

说明:Proxy对象的用法,都是上面这样的形式,不同的只是handler参数写法不同。 target表示拦截的对象,handler参数也是对象,用来定制拦截行为。

1.2例子:

javascript">  const proxy1 = new Proxy(
            {},
            {
                get: function (target, propkey) {
                    return 35;
                },
            }
        );
        console.log(proxy1.item); //35
        console.log(proxy1.good); //35

说明:配置对象中有一个get方法,用来拦截对目标对象属性的访问请求。get方法有两个参数分别是目标对象和所要访问的属性。

注意:注意:要是的Proxy起作用,必须针对Proxy实例进行操作,而不是针对目标对象(空对象)进行操作。

1.3例子

说明:如果没有设置任何拦截,那么等同于通向源对象

javascript">const obj1 = {
            name: "李四",
        };
        const proxy2 = new Proxy(obj1, {});
        console.log(proxy2.name); //李四

1.4例子

说明: Proxy实例也可以作为其他对象的原型对象

javascript"> const proxy3 = new Proxy(
            {},
            {
                get: function (a, b, c) {
                    return 35;
                },
            }
        );
        const obj2 = Object.create(proxy3);
        console.log(obj2.age); //35

注意: 同一个拦截器函数,可以设置拦截多个操作。

2.常见的Proxy支持的拦截操作

  1.  get(target,propkey,receiver)
  2.  set(target,propkey,value,receiver)
  3.  has(target,propkey)
  4.  deleteProperty(target,propKey)
  5.  ownKeys(target)  //拦截Object.keys(),for...in 循环

3.Proxy实例的方法

3.1get()

说明:get()用于拦截某个属性的读取,可以接受三个参数,为目标对象,属性,proxy实例本身

javascript"> const p1 = new Proxy(
            { name: "张三" },
            {
                get: function (target, propkey) {
                    if (propkey in target) {
                        return target[propkey];
                    } else {
                        //         throw new Error(`对象中没有${propkey}这个属性`)
                    }
                },
            }
        );
        console.log(p1.name); //张三
        console.log(p1.age); //对象中没有age这个属性

3.2 set()

说明:set()用来拦截某个属性的赋值操作,可以接受四个参数,target,key,value,proxy实例本身。

javascript"> const adult = {
            name: "张三",
            age: 18,
        };
        const p2 = new Proxy(adult, {
            set: function (target, key, value) {
                if (key === "age") {
                    if (Number.isInteger(value)) {
                        console.log(value);
                        if (value < 100) {
                            target[key] = value;
                        } else {
                            throw Error("年龄值大于100");
                        }
                    } else {
                        throw Error("年龄值类型错误");
                    }
                }
            },
        });
        p2.age=600 //年龄值大于100
        p2.age="年龄" //年龄值类型错误

说明:每当对象发生变化时,会自动更新DOM。

规定:对象上面设置内部属性,属性名的第一个字符使用下划线开头,表示这些属性不应该被外部使用。结合get和set方法,就可以做到防止这些内部属性被外部读写。

3.3apply()

说明:apply方法用于拦截函数的调用,call和apply操作,apply方法可以接受三个参数,target,this(目标对象的上下文对象),args(目标对象的参数数组)。

javascript">  const target1 = function () {
            return `我是一个target1函数`;
        };
        const p3 = new Proxy(target1, {
            apply: function () {
                return `我是一个代理函数`;
            },
        });
        console.log(p3()); //我是一个代理函数

3.3.1例子:

javascript">    const double = {
            apply(target, contextThis, args) {
                console.log(Reflect.apply(...arguments));
            },
        };
        const fun1 = function (a, b) {
            return a + b;
        };
        const p4 = new Proxy(fun1, double);
        p4(1, 2); //3

3.4has()

说明:拦截HasProperty操作,典型操作in运算符。

javascript">   const obj3 = { name: "张三", _age: 25 };
        const p5 = new Proxy(obj3, {
            has(target, key) {
                if (key[0] === "_") {
                    throw Error("你没有这个权限")
                } else {
                    return console.log(true);
                }
            },
        });
        //  '_age' in p5 //你没有这个权限
        name in p5 //true

说明:如果原对象的属性名的第一个字符是下划线,proxy.has()就会返回你没有这个权限。

3.5construct()

说明:construct()方法用于拦截new命令,下面是拦截对象的写法。target:目标对象,args构造函数的参数数组,newTarget:创造实例对象,new命令作用的构造函数。

javascript">const p6 = new Proxy(function () { }, {
            construct(target, args, newTarget) {
                console.log(...args); //2
                return { value: 52 }
            }
        })
        console.log(new p6(2).value); //52

注意:由于construct()拦截的是构造函数,所以它的目标对象必须是函数,否则就会报错。

3.6ownKeys()

说明:ownKeys()方法用来拦截对象自身属性的读取操作。

javascript">  const p7 = new Proxy({ name: "张三", age: "18" }, {
            ownKeys(target) {
                return ["name"]
            }
        })
        console.log(Object.keys(p7)); //name

注意:ownKeys()方法返回的数组之中,必须包含原对象的所有属性,且不能包含多余的属性,否则报错。


http://www.niftyadmin.cn/n/329510.html

相关文章

AMBER分子动力学模拟之结果分析(最低能量结果)-- HIV蛋白酶-抑制剂复合物(3)

AMBER分子动力学模拟之结果分析(最低能量结果)-- HIV蛋白酶-抑制剂复合物(3) 在analysis目录下 解析.out文件 下载process_mdout.perl 脚本 perl process_mdout.perl ../md/md0.out ../md/md1.out ../md/md2.out # 可以不使用md0.out # 或者 $AMBERHOME/bin/process_md…

LeetCode_递归_中等_138.复制带随机指针的链表

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random&#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的深拷贝。 深拷贝应该正好由 n 个全新节点组成&#…

【算法】Minimum Difficulty of a Job Schedule 工作计划的最低难度

文章目录 Minimum Difficulty of a Job Schedule 工作计划的最低难度问题描述&#xff1a;分析代码 Tag Minimum Difficulty of a Job Schedule 工作计划的最低难度 问题描述&#xff1a; 问题 你需要制定一份 d 天的工作计划表。工作之间存在依赖&#xff0c;要想执行第 i …

【c++】哈希---unordered容器+闭散列+开散列

1.unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到 logN&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好的查询是&#xff0c;进…

用vs2010编译和调试多个arx版本的arx项目

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、一级标题二级标题三级标题四级标题五级标题六级标题升级原先vs2008版本的项目文件到2010,或直接用vs2010新建一个arx项目; vs中查看项目属性:Project menu -> Properties,项目名上右…

K8s进阶1——搭建K8s高可用集群

文章目录 一、资源清单二、系统初始化2.1 所有服务器配置2.2 master节点配置 三、nginxkeepalived3.1 主备机器上进行3.2 配置主节点3.3 配置备节点3.4 启动服务 四、部署etcd集群4.1 资源清单4.2 生成Etcd证书4.3 部署Etcd集群 五、安装Docker/kubeadm/kubelet5.1 安装docker5…

Elasticsearch 核心技术(十):GEO 地理查询(geo_bounding_box、geo_distance、geo_shape)

❤️ 博客主页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;大数据核心技术从入门到精通 文章目录 一、地理数据类型1.1、geo_point 地理点类型1.1.1、创建一个含有 geo_point 字…

图像处理:手写实现图像增广算法(旋转、亮度调整、裁剪与拼接)

前言 图像增广算法在计算机视觉领域扮演着至关重要的角色。随着深度学习的兴起&#xff0c;大规模数据集的需求变得更加迫切&#xff0c;而图像增广算法可以通过对原始图像进行一系列变换&#xff0c;扩充数据集&#xff0c;从而提升模型的泛化能力和鲁棒性。 本文将着重介绍…