【ES6】JavaScript的Proxy:理解并实现高级代理功能

news2024/11/26 12:16:03

在JavaScript中,Proxy是一种能够拦截对对象的读取、设置等操作的机制。它们提供了一种方式,可以在执行基本操作之前或之后,对这些操作进行自定义处理。这种功能在许多高级编程场景中非常有用,比如实现数据验证、日志记录、权限控制等。

1、理解Proxy

在JavaScript中,对象具有一些基本操作,如属性查找、赋值、删除等。当你访问一个对象的属性时,JavaScript会直接返回该属性的值。然而,如果你使用Proxy来“代理”这个对象,那么在执行这些基本操作时,你就可以在JavaScript引擎执行基本操作之前或之后,插入自定义的处理逻辑。

2、创建Proxy

要创建一个Proxy,你需要使用Object.create()方法,并传入一个具有get和set方法的对象作为参数。get方法会在读取属性时被调用,set方法会在设置属性时被调用。

const target = { a: 1, b: 2 };
const handler = {
  get: function(target, prop, receiver) {
    console.log(`Reading ${prop}`);
    return Reflect.get(...arguments);
  },
  set: function(target, prop, value, receiver) {
    console.log(`Setting ${prop}`);
    return Reflect.set(...arguments);
  }
};

const proxy = new Proxy(target, handler);

在上面的代码中,我们创建了一个名为target的对象,并定义了一个handler对象来处理对target的访问。然后我们使用new Proxy()构造函数创建了一个新的对象proxy,该对象会“代理”对target的访问。
同一个拦截器函数,可以设置拦截多个操作。

var handler = {
  get: function(target, name) {
    if (name === 'prototype') {
      return Object.prototype;
    }
    return 'Hello, ' + name;
  },

  apply: function(target, thisBinding, args) {
    return args[0];
  },

  construct: function(target, args) {
    return {value: args[1]};
  }
};

var fproxy = new Proxy(function(x, y) {
  return x + y;
}, handler);

fproxy(1, 2) // 1
new fproxy(1, 2) // {value: 2}
fproxy.prototype === Object.prototype // true
fproxy.foo === "Hello, foo" // true

对于可以设置、但没有设置拦截的操作,则直接落在目标对象上,按照原先的方式产生结果。

下面是 Proxy 支持的拦截操作一览,一共 13 种。

  • get(target, propKey, receiver):拦截对象属性的读取,比如proxy.foo和proxy[‘foo’]。
  • set(target, propKey, value, receiver):拦截对象属性的设置,比如proxy.foo = v或proxy[‘foo’] = v,返回一个布尔值。
  • has(target, propKey):拦截propKey in proxy的操作,返回一个布尔值。
  • deleteProperty(target, propKey):拦截delete proxy[propKey]的操作,返回一个布尔值。
  • ownKeys(target):拦截Object.getOwnPropertyNames(proxy)、Object.getOwnPropertySymbols(proxy)、Object.keys(proxy)、for…in循环,返回一个数组。该方法返回目标对象所有自身的属性的属性名,而Object.keys()的返回结果仅包括目标对象自身的可遍历属性。
  • getOwnPropertyDescriptor(target, propKey):拦截Object.getOwnPropertyDescriptor(proxy, propKey),返回属性的描述对象。
  • defineProperty(target, propKey, propDesc):拦截Object.defineProperty(proxy, propKey, propDesc)、Object.defineProperties(proxy, propDescs),返回一个布尔值。
  • preventExtensions(target):拦截Object.preventExtensions(proxy),返回一个布尔值。
  • getPrototypeOf(target):拦截Object.getPrototypeOf(proxy),返回一个对象。
  • isExtensible(target):拦截Object.isExtensible(proxy),返回一个布尔值。
  • setPrototypeOf(target, proto):拦截Object.setPrototypeOf(proxy, proto),返回一个布尔值。如果目标对象是函数,那么还有两种额外操作可以拦截。
  • apply(target, object, args):拦截 Proxy 实例作为函数调用的操作,比如proxy(…args)、proxy.call(object, …args)、proxy.apply(…)。
  • construct(target, args):拦截 Proxy 实例作为构造函数调用的操作,比如new proxy(…args)。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/949039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

银行固定资产怎么管理?如何自查现有资产问题?

银行固定资产的管理涉及到资产的购置、采购、维护、保管和清理等多个环节,为了更好地管理和优化固定资产,银行可以从以下几个方面入手: 建立完善的固定资产清单 银行应该建立一个完善的固定资产清单,包括每一项固定资产的名称、类…

MySQL怎样删除重复数据,只保留一条?

在实际工作开发过程中,常常会遇到数据库表中存在多条数据重复了,此时我们需要删除重复数据,只保留其中一条有效的数据; 针对这种场景,我们用SQL语句该怎么实现呢? 数据准备 建表语句: DROP …

盘点科智立KEZLIY那些工业自动化环节使用的RFID读取设备

在工业自动化领域,射频识别(RFID)技术已成为提高生产效率和降低成本的重要手段。科智立KEZLIY作为国内知名的RFID设备供应商,其产品在多个工业自动化环节中得到了广泛应用。本文将为您盘点科智立KEZLIY那些工业自动化环节使用的RF…

亚马逊店铺出新品时,应该注意什么?

要想提升产品销量的话,产品质量不仅要好,同时还需要做好推广宣传,这样单单还不够,还需要做好买家评论。 现如今,由于开亚马逊店铺的人越来越多,导致开亚马逊店铺的市场竞争力也变得越来越大,以…

INDEMIND:“大+小”多机协同,实现机器人商用场景全覆盖

随着商用清洁机器人进入越来越多的场景中,单一的中型机器人并不能有效覆盖所有区域,更加细分化的产品组合正在成为新的趋势。 产品形态的“新趋势” 在商用场景中,目前的商用清洁机器人几乎均是中大型的产品形态,较大的体型意味…

低粉UP主缔造百万播放,下半年B站内容战怎么打?

都知道有热点要懂得蹭,但是等热点开始火起来的时候,腰部以下没有夯实粉丝基础的账号很难在这个内容浪潮中脱颖而出,除非内容差异化很明显,质量突出才会更容易受到关注,更多的情况是流量平平,或者稍有起伏。…

句子时态四:完成进行态(现在完成进行时、过去完成进行时、将来完成进行时、过去将来完成进行时)

课程目标(掌握前两个) 现在完成进行时(重点掌握) 定义 用法 时态标志词 过去完成进行时(重点掌握) 定义 用法 将来完成进行时 (了解拓展) 定义 用法 过去将来完成进行时&#xf…

Zookeeper的使用

一、Zookeeper简介 分布式协调框架,小型的树形结构数据共享储存系统。 zookeeper的应用场景 集群管理 注册中心 配置中心 发布者将数据发布到ZooKeeper一系列节点上面,订阅者进行数据订阅,当数据有变化时,可及时得到数据的变…

164到网络安全面试大全(附答案)

最近有不少小伙伴跑来咨询: 想找网络安全工作,应该要怎么进行技术面试准备?工作不到 2 年,想跳槽看下机会,有没有相关的面试题呢? 为了更好地帮助大家高薪就业,今天就给大家分享两份网络安全工…

HarmonyOS“一次开发,多端部署“优秀实践——玩机技巧,码上起航

随着终端设备形态日益多样化,分布式技术逐渐打破单一硬件边界,一个应用或服务,可以在不同的硬件设备之间按需调用、互助共享,让用户享受无缝的全场景体验。作为应用开发者,广泛的设备类型也能为应用带来广大的潜在用户…

怎么编辑pdf?这几种编辑技巧看看

怎么编辑pdf?PDF文件是一种非常常见的文件格式,它可以被很多程序打开,但却不容易被编辑。然而,有时候我们需要编辑PDF文件,比如在一份PDF文件中添加或删除一些内容,或者对PDF文件进行注释,签名等…

ELK安装、部署、调试(一)设计规划及准备

一、整体规划如图: 【filebeat】 需要收集日志的服务器,安装filebeat软件,用于收集日志。logstash也可以收集日志,但是占用的系统资源过大,所以使用了filebeat来收集日志。 【kafka】 接收filebeat的日志&#xff…

F5服务器负载均衡能力如何?一文了解

但凡知道服务器负载均衡这个名词的,基本都知道 F5,因为负载均衡是 F5 的代表作,换句话来说,负载均衡就是由 F5 发明的。提到F5服务器负载均衡能力如何?不得不关注F5提出的关于安全、网络全面优化的解决方案&#xff0c…

代码复现,我能行之DMP-MATLAB

代码复现,我能行——系列一 一、基础概念 Dynamic Movement Primitives (DMP),中文为动态运动基元或动态运动原语,由美国University of Southern California的Stefan Schaal教授团队于2002年提出,是一种用…

【转存】Lambda 表达式完整教程

Java Lambda表达式的一个重要用法是简化某些匿名内部类(Anonymous Classes)的写法。实际上Lambda表达式并不仅仅是匿名内部类的语法糖,JVM内部是通过invokedynamic指令来实现Lambda表达式的。具体原理放到下一篇。本篇我们首先感受一下使用La…

【LeetCode-中等题】114. 二叉树展开为链表

文章目录 题目方法一:前序遍历(构造集合) 集合(构造新树)方法二:原地构建方法三:前序遍历--迭代(构造集合) 集合(构造新树) 题目 方法一&#x…

中间继电器 ZQGZ-PY31 DC220V 导轨安装 品牌:JOSEF约瑟

ZQGZ-04、31、22、40导轨安装系列中间继电器用于电力系统继电保护及各种自动控制线路中。以增加保护和控制线路中的触点数量及触电容量。 系型型号 ZQGZ-04 ZQGZ-31 ZQGZ-22 ZQGZ-40 ZQGZ-RJ04 ZQGZ-RJ31 ZQGZ-RJ22 ZQGZ-RJ40 ZQGZ-PJ04 ZQGZ-PJ31 ZQGZ-PJ22 ZQGZ-PJ40 …

iPhone 15 Pro与iPhone 13 Pro:最大的预期升级

如果你在2021年首次发布iPhone 13 Pro时就抢到了它,那么你的合同很可能即将到期。虽然距离iPhone 15系列还有几周的时间,但你可能已经在想:是时候把你的旧iPhone升级为iPhone 15 Pro了吗? 我们认为iPhone 13 Pro是你现在能买到的最好的手机之一。但如果你想在2023年晚些时…

JVM解密: 解构类加载与GC垃圾回收机制

文章目录 一. JVM内存划分二. 类加载机制1. 类加载过程2. 双亲委派模型 三. GC垃圾回收机制1. 找到需要回收的内存1.1 哪些内存需要回收?1.2 基于引用计数找垃圾(Java不采取该方案)1.3 基于可达性分析找垃圾(Java采取方案) 2. 垃圾回收算法2.1 标记-清除算法2.2 标记…

国标GB28181视频平台EasyGBS国标平台智能边缘计算网关关于小区电动车进电梯的应用方案设计

一、行业背景 随着人工智能技术的不断成熟与落地,各行各业也逐渐融入AI智能检测技术,尤其是在视频监控领域,通过AI视频智能检测与分析,可以大大提高视频的自动化、智能化监控能力。比如在小区的管理中,由电动车上楼入…