当前位置: 首页 > news >正文

javascript的Proxy

1. 什么是Proxy

Proxy是ES6中新增的一个特性,它可以拦截对象的操作,提供了一个中间层来控制对目标对象的访问。简单来说,它可以对对象进行代理,从而实现对对象的监控、修改、过滤等操作。

2. 为什么出现Proxy

在JavaScript中,对象的属性可以被任意修改,这就会导致一些安全问题和难以调试的问题。Proxy的出现就是为了解决这些问题,它可以拦截对象的操作,从而实现对对象的监控和控制。

3. 怎么使用Proxy

使用Proxy需要创建一个Proxy对象,它接收两个参数:目标对象和一个处理程序对象。处理程序对象中定义了一些拦截器方法,用于拦截目标对象的操作。

下面是一个简单的例子:

let target = {name: 'Tom',age: 18
};let handler = {get(target, propKey) {console.log('get操作');return target[propKey];},set(target, propKey, value) {console.log('set操作');target[propKey] = value;}
};let proxy = new Proxy(target, handler);console.log(proxy.name); // 输出:get操作 Tom
proxy.age = 20; // 输出:set操作
console.log(proxy.age); // 输出:get操作 20

在上面的例子中,我们创建了一个目标对象target和一个处理程序对象handler,然后使用它们来创建了一个代理对象proxy。在代理对象中,我们定义了get和set拦截器方法,用于拦截目标对象的读取和修改操作。当我们对代理对象进行读取和修改操作时,会触发相应的拦截器方法。

4. 解决什么问题

使用Proxy可以解决一些安全问题和难以调试的问题,例如:

  • 对象的属性可以被任意修改,使用Proxy可以控制对对象的修改操作。
  • 对象的属性访问不够直观,使用Proxy可以实现对属性访问的监控和控制。
  • 对象的属性访问不够安全,使用Proxy可以实现对属性访问的过滤和检查。

5. Proxy的API和Proxy实例的讲解

Proxy提供了一些API和实例方法,用于实现对目标对象的拦截和控制。下面是一些常用的API和实例方法:

  • Proxy.revocable(target, handler):创建一个可撤销的代理对象。
  • Proxy.isRevoked(proxy):判断一个代理对象是否已经被撤销。
  • Proxy.apply(target, thisArg, args):拦截函数的调用操作。
  • Proxy.construct(target, args):拦截new操作符。
  • Proxy.defineProperty(target, propKey, propDesc):拦截Object.defineProperty()操作。
  • Proxy.deleteProperty(target, propKey):拦截delete操作。
  • Proxy.get(target, propKey, receiver):拦截属性读取操作。
  • Proxy.set(target, propKey, value, receiver):拦截属性设置操作。
  • Proxy.has(target, propKey):拦截in操作符。
  • Proxy.getOwnPropertyDescriptor(target, propKey):拦截Object.getOwnPropertyDescriptor()操作。
  • Proxy.getPrototypeOf(target):拦截Object.getPrototypeOf()操作。
  • Proxy.setPrototypeOf(target, proto):拦截Object.setPrototypeOf()操作。
  • Proxy.isExtensible(target):拦截Object.isExtensible()操作。
  • Proxy.preventExtensions(target):拦截Object.preventExtensions()操作。
  • Proxy.ownKeys(target):拦截Object.getOwnPropertyNames()和Object.getOwnPropertySymbols()操作。

1. Proxy构造函数

Proxy构造函数用于创建一个代理对象,它接收两个参数:目标对象和handler对象。其中,目标对象是被代理的对象,handler对象包含了一系列拦截器方法,用于拦截目标对象的各种操作。

下面是Proxy构造函数的基本使用流程和思路:

const target = {}; // 目标对象
const handler = {}; // handler对象const proxy = new Proxy(target, handler); // 创建代理对象

在上面的代码中,我们创建了一个空对象作为目标对象,并创建了一个空对象作为handler对象。然后,我们使用Proxy构造函数创建了一个代理对象proxy,它将目标对象target和handler对象绑定在一起。

2. handler对象

handler对象包含了一系列拦截器方法,用于拦截目标对象的各种操作。这些方法在代理对象proxy被访问时被调用,它们接收两个参数:目标对象和操作参数。

下面是handler对象的基本使用流程和思路:

const handler = {get(target, key) {console.log(`Getting ${key} from target`);return target[key];},set(target, key, value) {console.log(`Setting ${key} to ${value}`);target[key] = value;},// 其他拦截器方法
};const proxy = new Proxy({}, handler); // 创建代理对象

在上面的代码中,我们定义了两个拦截器方法get和set,它们分别用于拦截目标对象的读取和写入操作。当代理对象proxy被访问时,这些方法会被调用,并输出相应的信息。

3. Proxy实例的API基本使用流程和思路

除了上面提到的get和set方法之外,handler对象还包括了许多其他拦截器方法,用于拦截目标对象的各种操作。下面是一些常用的拦截器方法及其基本使用流程和思路:

  • get
    get方法会在读取属性时被调用,它接收三个参数:target、prop和receiver。其中,target表示被代理的对象,prop表示被访问的属性名,receiver表示操作发生的对象。在get方法中,我们可以返回任何值,以便代理对象继续执行后续操作。如果我们不想让属性被访问,可以抛出一个错误。
const handler = {get: function(target, prop, receiver) {console.log(`Getting ${prop}`);if (prop === 'password') {throw new Error('Access denied');}return Reflect.get(target, prop, receiver);}
};

在上面的代码中,我们对password属性进行了限制,如果访问该属性,就会抛出一个错误。

  • set
    set方法会在设置属性时被调用,它接收四个参数:target、prop、value和receiver。其中,target表示被代理的对象,prop表示要设置的属性名,value表示要设置的属性值,receiver表示操作发生的对象。在set方法中,我们可以对属性值进行修改,或者抛出一个错误以阻止属性值被设置。
const handler = {set: function(target, prop, value, receiver) {console.log(`Setting ${prop} to ${value}`);if (prop === 'password') {throw new Error('Access denied');}return Reflect.set(target, prop, value, receiver);}
};

在上面的代码中,我们对password属性进行了限制,如果设置该属性,就会抛出一个错误。

  • has
    has方法会在判断属性是否存在时被调用,它接收两个参数:target和prop。其中,target表示被代理的对象,prop表示要判断的属性名。在has方法中,我们可以返回一个布尔值,表示属性是否存在。
const handler = {has: function(target, prop) {console.log(`Checking if ${prop} exists`);return Reflect.has(target, prop);}
};

在上面的代码中,我们输出了一个日志,然后调用了Reflect.has方法来判断属性是否存在。

  • apply方法:用于拦截函数的调用操作
const handler = {apply(target, thisArg, args) {console.log(`Calling ${target.name} with arguments: ${args}`);return target.apply(thisArg, args);},
};function sum(a, b) {return a + b;
}const proxy = new Proxy(sum, handler);proxy(1, 2); // 输出 "Calling sum with arguments: 1,2"

在上面的代码中,我们定义了一个拦截器方法apply,它用于拦截函数的调用操作。当代理对象proxy被调用时,这个方法会被调用,并输出相应的信息。

  • getPrototypeOf方法:用于拦截获取目标对象的原型操作
const handler = {getPrototypeOf(target) {console.log(`Getting prototype of target`);return Object.getPrototypeOf(target);},
};const obj = {};
const proxy = new Proxy(obj, handler);Object.getPrototypeOf(proxy); // 输出 "Getting prototype of target"

在上面的代码中,我们定义了一个拦截器方法getPrototypeOf,它用于拦截获取目标对象的原型操作。当代理对象proxy被访问时,这个方法会被调用,并输出相应的信息。

  • has方法:用于拦截in操作符的操作。
const handler = {has(target, key) {console.log(`Checking if ${key} is in target`);return key in target;},
};const obj = { a: 1 };
const proxy = new Proxy(obj, handler);"a" in proxy; // 输出 "Checking if a is in target"

在上面的代码中,我们定义了一个拦截器方法has,它用于拦截in操作符的操作。当代理对象proxy被访问时,这个方法会被调用,并输出相应的信息。

  • deleteProperty方法:用于拦截delete操作符的操作。
const handler = {deleteProperty(target, key) {console.log(`Deleting ${key} from target`);delete target[key];},
};const obj = { a: 1 };
const proxy = new Proxy(obj, handler);delete proxy.a; // 输出 "Deleting a from target"

在上面的代码中,我们定义了一个拦截器方法deleteProperty,它用于拦截delete操作符的操作。当代理对象proxy被访问时,这个方法会被调用,并输出相应的信息。

6. Proxy的使用场景

使用Proxy可以实现很多功能,例如:

  • 实现数据绑定:可以通过拦截属性设置操作来实现数据绑定。
  • 实现数据校验:可以通过拦截属性设置操作来实现数据校验。
  • 实现数据缓存:可以通过拦截属性读取操作来实现数据缓存。
  • 实现缓存代理:可以通过拦截函数调用操作来实现缓存代理。

7. Proxy的注意事项

使用Proxy需要注意以下几点:

  • Proxy不支持原型继承,即代理对象不能继承原始对象的原型链。
  • Proxy不支持一些内置方法的代理,例如toString()、valueOf()等方法。
  • Proxy不支持直接修改代理对象,必须通过拦截器方法进行修改。
  • Proxy的拦截器方法中,必须返回一个合法的值,否则会报错。

相关文章:

javascript的Proxy

1. 什么是Proxy Proxy是ES6中新增的一个特性,它可以拦截对象的操作,提供了一个中间层来控制对目标对象的访问。简单来说,它可以对对象进行代理,从而实现对对象的监控、修改、过滤等操作。 2. 为什么出现Proxy 在JavaScript中&a…...

Python发送微信模板消息

1、根据appid,secret获取token 2、查找粉丝 3、指定模板及粉丝id发送模板消息 4、链接SqlServer数据库获取消息任务 5、创建定时任务监听消息 from logging import exception import time import pymysql import datetime; from utils.http_utils import *; from model.msg_wx_…...

springboot(ssm医院门诊信息管理系统 医院管理平台Java(codeLW)

springboot(ssm医院门诊信息管理系统 医院管理平台Java(code&LW) 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0&am…...

css所有属性介绍

文章目录 1️⃣ CSS属性介绍1.1 CSS3 动画属性(Animation)1.2 CSS 背景属性(Background)1.3 CSS 边框属性(Border 和 Outline)1.4 Box 属性1.5 Color 属性1.6 Content for Paged Media 属性1.7 CSS 尺寸属性…...

C#语言高阶开发

目录 数据结构 集合 动态数组ArrayList 习题:声明一个Monster类,有一个Attack方法,用一个ArrayList去封装Monster的对象,装10个,遍历monster的list让他们释放攻击方法 哈希表HashTable 创建一个武器类,有一个属性叫做id,每个…...

使用Qt Designer设计水平布局,加addStretch()不起作用,解决办法?

解决办法: 将main函数中的MainWindow.show()改为:ui.show() if __name____main__:app QApplication(sys.argv)MainWindow QMainWindow()ui Ui_MainWindow()ui.setupUi(MainWindow)ui.show()app.exec()完整代码: import sysfrom PyQt5 i…...

数据结构:带头双向循环链表的实现

引言 单链表存在缺陷:需要从头开始找前一个节点 解决方法:双向链表 链表的结构(8种): 1. 单向,双向 2. 带头、不带头 带头即为带哨兵位的头节点,第一个节点不存储有效数据。带头节点&#…...

最小生成树(Minimum Spanning Tree)及生成MST的几种方法

最小生成树 (Minimum Spanning Tree) 最小生成树是图论领域的一个基本概念,适用于加权连通图,其中包括若干顶点(节点)以及连接这些顶点的边(边可以有权重)。在一个加权连通图中,生成树&#xf…...

逻辑漏洞 暴力破解(DVWA靶场)与验证码安全 (pikachu靶场) 全网最详解包含代码审计

逻辑漏洞 暴力破解(DVWA靶场)与验证码安全 (pikachu靶场) 全网最详解包含代码审计 0x01 前言 在当今互联网的广袤世界中,各式交互平台层出不穷。每一个交互平台几乎都要求用户注册账号,而这些账号则成为我们在数字世界中的身份象征。账号的安全性变得至…...

io基础入门

压缩的封装 参考:https://blog.csdn.net/qq_29897369/article/details/120407125?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-120407125-blog-120163063.235v38pc_relevant_sort_base3&spm1001.2101.3001.…...

k8s ingress 无法找到端点

文章目录 ingress rule无法找到端点这个注解是什么意思呢?为何不生效呢?端点无法更新?如何确认ingressclass呢?修复端点无法发现的问题多个ingress controller 架构 ingress rule无法找到端点 在vnnox-cn集群创建ingress&#xf…...

properties转yml

目前搜索到的大部分代码都存在以下问题: 复杂结构解析丢失解析后顺序错乱 所以自己写了一个,经过不充分测试,基本满足使用。可以直接在线使用 在线地址 除了yml和properties互转之外,还可以生成代码、sql转json等,可…...

谈谈中间件设计的思路

前言 想要设计和真正理解中间件的架构理论和思想。对于开发来说需要具备三个关键的能力 1:基础通用技术的深入理解和运用2:了解和熟悉常见中间件的设计思想,且有自己的感悟,并且能按照自己的理解模仿写一写3:业务的高度理解能力…...

WT2605-24SS音频蓝牙录放语音芯片:标准蓝牙功能与多样化存储播放方式助力音频体验升级

在音频技术日新月异的今天,WT2605-24SS音频蓝牙录放语音芯片以其强大的功能和出色的性能,成为了音频市场的一颗璀璨明星。该芯片不仅具备标准音频蓝牙功能,还支持蓝牙电话本、录音功能以及多种存储和播放方式,为用户提供了更加便捷…...

openssl生成ssl证书

x509证书一般会用到三类文,key,csr,crt。 Key 是私用密钥openssl格,通常是rsa算法。 Csr 是证书请求文件,用于申请证书。在制作csr文件的时,必须使用自己的私钥来签署申,还可以设定一个密钥。…...

以太网PHY,MAC接口

本文主要介绍以太网的 MAC 和 PHY,以及之间的 MII(Media Independent Interface ,媒体独立接口)和 MII 的各种衍生版本——GMII、SGMII、RMII、RGMII等。 简介 从硬件的角度看,以太网接口电路主要由MAC(M…...

c语言中 , x++ 和 ++x的区别

一 c语言中 , x 和 x的区别 x 和 x 是 C 语言中的自增运算符,它们的区别在于它们的执行时机和返回值: 1. x (后缀自增): 先使用变量的值,然后再将变量的值加 1。这意味着,如果你在一个表达式中使用了 x,那么该表达式…...

DBeaver 社区版(免费版)下载、安装、解决驱动更新出错问题

DBeaver 社区版(免费版) DBeaver有简洁版,企业版,旗舰版,社区版(免费版)。除了社区版,其他几个版本都是需要付费的,当然相对来说,功能也要更完善些&#xff…...

景联文科技加入中国人工智能产业联盟(AIIA)数据委员会

近日,景联文科技加入中国人工智能产业联盟(AIIA)数据委员会,成为委员会成员单位。 中国人工智能产业发展联盟(简称AIIA)是在国家发改委、科技部、工信部、网信办指导下,由中国信息通信研究院等单…...

数据结构 / 结构体指针

1. 格式 struct 结构体名{数据类型 成员1;数据类型 成员2; .... };struct 结构体名 *指针变量名 2. 结构体指针指向普通变量的地址 struct CAR{char name[10];int price; };struct CAR car{"byd",160}; struct CAR *p&car; //p是指向结构体变量car的指针// p…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

12.找到字符串中所有字母异位词

🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...

LangFlow技术架构分析

🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...