ES6中Proxy

news/2024/11/23 2:50:43/

1. Proxy

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

1.1例子:

 const proxy=new Proxy(target,handler)

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

1.2例子:

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

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

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

1.3例子

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

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

1.4例子

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

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

 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实例本身。

 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 //年龄值大于100p2.age="年龄" //年龄值类型错误

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

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

3.3apply()

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

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

3.3.1例子:

    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运算符。

   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命令作用的构造函数。

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

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

3.6ownKeys()

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

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

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


http://www.ppmy.cn/news/68815.html

相关文章

Linux开发板安装Python环境

1. 环境介绍 硬件&#xff1a;STM32MP157&#xff0c;使用的是野火出的开发板。 软件&#xff1a;Debian ARM 架构制作的 Linux 发行版&#xff0c;版本信息如下&#xff1a; Linux发行版本&#xff1a;Debian GNU/Linux 10 内核版本&#xff1a;4.19.94 2. Python 简介…

十、Feign客户端

目录 1、在springcloud-order项目中引入Feign客户端的依赖 2、在server-order服务的启动类中添加注解EnableFeignClients 3、使用FeignClient注解声明Feign客户端需要调用的远程接口 3.1、server-pay服务提供远程接口Controller 3.2、server-member服务提供远程接口Contro…

从小白到黑客高手:一份全面详细的学习路线指南

前言 黑客从入门到精通需要经过深入的学习和实践&#xff0c;这是一个需要长时间投入和大量精力的过程。在这份学习路线中&#xff0c;我将为你介绍黑客学习的基本知识和技能&#xff0c;帮助你逐步掌握黑客技能。 黑客 一、入门阶段 1.了解计算机基础知识 学习计算机基础知…

MySQL深入浅出: order by if()与order by in()之条件排序

目录 1&#xff1a;原表数据 2&#xff1a;order by if&#xff08;&#xff09; 3&#xff1a;order by in&#xff08;&#xff09; 4&#xff1a;社区地址 1&#xff1a;原表数据 2&#xff1a;order by if&#xff08;&#xff09; SELECT * FROM people ORDER BY IF(…

使用Kubernetes进行CI/CD的最佳实践

使用Kubernetes进行CI/CD的最佳实践 一、概述1 CI/CD的定义2 Kubernetes在CI/CD中的重要性3 Kubernetes用于CI/CD的优势 二、Kubernetes的CI/CD工作流程1 代码构建1.1 使用Docker镜像构建1.2 使用Kubernetes插件构建 2 代码集成和测试2.1 使用Kubernetes的namespace分离测试环境…

【地铁上的设计模式】--行为型模式:策略模式

什么是策略模式 策略模式是一种行为型设计模式&#xff0c;它允许在运行时选择算法的行为。这种模式通过定义一系列算法&#xff0c;并将每个算法封装到一个独立的类中&#xff0c;使得它们可以相互替换。通过这种方式&#xff0c;客户端可以根据需要选择要使用的算法&#xf…

Postgresql数组与Oracle嵌套表的使用区别

oracle中的多维数组 Oracle中常说的数组就是嵌套表&#xff0c;下面给出两个多维使用实例&#xff0c;引出和PG的差异&#xff1a; 一维赋值&#xff08;第一行给1列&#xff09; set serveroutput on; declaretype arr_num is table of number;type arr_arr_num is table o…

算法修炼之练气篇——练气十四层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…