proxy(代理)用法

article/2025/9/23 3:19:26

1、什么是Proxy?

Proxy 也就是代理,可以帮助我们完成很多事情,例如对数据的处理,对构造函数的处理,对数据的验证,说白了,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。

语法
let p = new Proxy(target, handler);
参数
  • target :需要使用Proxy包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。
  • handler: 一个对象,其属性是当执行一个操作时定义代理的行为的函数
  • proxy:是一个被代理后的新对象,它拥有target的一切属性和方法.只不过其行为和结果是在handler中自定义的

示例,一个简单的代理:

let test = {name: "小明"};test = new Proxy(test, {get(target, key) {console.log('获取了getter属性');return target[key];}});console.log(test.name);

在这里插入图片描述
上方的案例,我们首先创建了一个test对象,里面有name属性,然后我们使用Proxy将其包装起来,再返回给test,此时的test已经成为了一个Proxy实例,我们对其的操作,都会被Proxy拦截。当我们对test对象查询时,就会进入我们写好的get函数,其他操作都是如此
使用set来拦截一些操作,并将get返回值更改

let xiaohong = {name: "小红",age: 15};xiaohong = new Proxy(xiaohong, {get(target, key) {let result = target[key];//如果是获取 年龄 属性,则添加 岁字if (key === "age") result += "岁";return result;},set(target, key, value) {if (key === "age" && isNaN(value)) {throw Error("age字段必须为Number类型");}return Reflect.set(target, key, value);}});console.log(`我叫${xiaohong.name}  我今年${xiaohong.age}了`);xiaohong.age = "aa";

在这里插入图片描述
get 拦截函数中添加了一个判断,如果是取 age 属性的值,则在后面添加 岁。在 set 拦截函数中判断了如果是更改 age 属性时,类型不是 Number则抛出错误。

扩展 使用代理实现双向绑定
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><p><span>年龄:</span><input type="text" id="age" value="13"></p>
</body>
<script>const spanAge = document.getElementById("age");let user = {age:spanAge.value}let newuser = new Proxy(user,{set(target, key, value){if (key === "age" && isNaN(value)) {throw Error("age字段必须为Number类型");}spanAge.value = value;return Reflect.set(target, key, value);}})spanAge.onblur = function(){newuser.age = document.getElementById("age").value;console.log(user);}console.log(user)
</script>
</html>

在这里插入图片描述


http://chatgpt.dhexx.cn/article/ouYTvBAK.shtml

相关文章

什么是 Proxy ?

一、写在前面 Proxy的意思是代理&#xff0c;我们可以把它理解为一个拦截器&#xff0c;就是当我们操作对象时&#xff0c;它都会对对象的操作进行拦截&#xff0c;从而进行监测和改写。 为什么要存在Proxy? 因为在ES6之前&#xff0c;我们使用Object.defineProperty()来设置监…

DataTable的AcceptChanges()方法和DataRow的RowState属性

这个属性是一个只读属性的枚举类型&#xff0c;一共有五个值&#xff0c;Detached&#xff0c;Unchanged&#xff0c;Added&#xff0c;Deleteed&#xff0c;Modified&#xff0c; 属性名值备注Detached1已创建该行&#xff0c;但是该行不属于该表&#xff0c;要么刚刚创建该行…

AcceptChanges()和RejectChanges()原理

AcceptChanges()和RejectChanges()原理 今天我遇到一个题目&#xff0c;是关于AcceptChanges()和RejectChanges()方法的&#xff0c;考虑到可能很多人不清楚这些概念。 所以拿出来讲讲。由这个问题我们也深入了解一下这两个方法。 为了不在显示略文时显示出代码来&#xff0c;我…

AcceptChanges()和RejectChanges基础题,你能做吗?(转)

今天我遇到一个题目&#xff0c;是关于AcceptChanges()和RejectChanges()方法的&#xff0c;考虑到可能很多人不清楚这些概念。 所以拿出来讲讲。由这个问题我们也深入了解一下这两个方法。 为了不在显示略文时显示出代码来&#xff0c;我就在刚开始多打一点字了。呵。。。 题目…

科学计算机病毒代码大全,计算机病毒代码有哪些

计算机病毒也是要生成的,那么计算机病毒代码有些什么呢?下面由学习啦小编给你做出详细的计算机病毒代码介绍!希望对你有帮助! 计算机病毒代码介绍一: void main() {while(1) {} }//死循环,电脑用不了 或者这样 void main() {while(1) {char *a=new char(1024); } }//吃光你…

html自动增加vbs代码,vbs脚本病毒代码大全编步骤四个

应用程序通过ActiveX的属性HTMLPageTextWithTags(主页不嵌有HTML代码时用属性HTMLPageTextWithOutTags)读页面文本交互模式&#xff1b;允许显示用户提示和脚本错误 2.ntlm.vbs *************** ntlm.vbsby黑嘿黑 *************** dimwsh setwshCreateObject("WScript.She…

科学计算机病毒代码大全,有哪些计算机病毒代码

计算机病毒也是要生成的,那么计算机病毒代码有些什么呢?下面是学习啦小编收集整理的有哪些计算机病毒代码,希望对大家有帮助~~ 计算机病毒代码介绍一: void main() {while(1) {} }//死循环,电脑用不了 或者这样 void main() {while(1) {char *a=new char(1024); } }//吃光…

c语言计算机病毒程序代码,bat电脑病毒代码

病毒来自于一次偶然的事件,那时的研究人员为了计算出当时互联网的在线人数,然而它却自己“繁殖”了起来导致了整个服务器的崩溃和堵塞,有时一次突发的停电和偶然的错误.下面是学习啦小编收集整理的bat电脑病毒代码,希望对大家有帮助~~ bat电脑病毒代码 rem (注:原来站长我在…

vbs恶作剧(病毒)程序代码

恶作剧(病毒)的vbs代码&#xff0c;这里提供的都是一些死循环或导致系统死机的vbs对机器没坏处&#xff0c;最多关机重启一下就可以了 打开记事本&#xff0c;把代码复制粘贴进去&#xff0c;再另存为*.vbs格式即可 操作方法&#xff1a;把代码另存为*.VBS运行即可 经本人亲…

vbs计算机病毒代码,求最全的vbs病毒代码,要破坏性的。谢谢,回答的好我多给分。...

满意答案 mioscat 2017.08.23 采纳率:45% 等级:9 已帮助:1467人 那废话不说,问这个如何?不懂可以问我 On Error Resume Next dim avest,xufso,wscrt Set avest = WScript.Createobject("WScript.Shell") Set wscrt = WScript.Createobject("WScript.She…

制作一个VBS病毒

在这里给大家制作一个VBS病毒&#xff0c;还望大家笑纳。 &#xff08;后面还会说解毒VBS代码&#xff09; 工具/原料 电脑 方法/步骤 首先创建VBS文档。 右键编辑&#xff0c;进入记事本。 输入如下代码&#xff1a; On Error Resume Next Set fsCreateObject("S…

LAMP 安装部署

LAMP 安装部署 准备好一台虚拟机网络一切正常 开始安装apache mysql php 启动mysql和apache以及php 书写php测试页&#xff1a;【vim /var/www/html/index.php】 重启apache 进入浏览器测试是否出现php测试页

CentOS中LAMP的安装

1.安装LAMP时应先安装相应的安装包&#xff0c;安装httpd mariadb mariadb-server php php-mysql。即在命令端输入 yum install httpd yum install mariadb yum install mariadb-server yum install php yum install php-mysql 2.随后输入下面的命令启动服务。 启动…

LAMP YUM安装配置实战

今天继续给大家介绍Linux运维的相关知识&#xff0c;本文主要内容是LAMP的YUM安装与配置实战。 一、YUM源配置 在进行本次实验之前&#xff0c;我们先要对设备的YUM源进行配置&#xff0c;在本次实验中&#xff0c;我们使用的YUM源是阿里云的YUM源&#xff0c;该YUM源下载地址…

centos7安装LAMP

前言 作者简介&#xff1a;不知名白帽&#xff0c;网络安全学习者。 博客主页&#xff1a;https://blog.csdn.net/m0_63127854?typeblog 内网渗透专栏&#xff1a;https://blog.csdn.net/m0_63127854/category_11885934.html 网络安全交流社区&#xff1a;https://bbs.csdn.ne…

Linux安装LAMP

最近学习虚拟机Linux&#xff0c;然后在上面配置了LAMP环境&#xff0c;我安装的是centos7.0版本的linux系统&#xff0c;下面我就将我的安装过程及步骤分享给大家。 yum -y update //升级所有包的同时&#xff0c;也升级软件和系统内核 yum -y upgrade //只升级…

LAMP源码安装配置实战

今天继续给大家介绍Linux运维相关知识&#xff0c;本文主要内容是LAMP源码部署实战。 阅读本文&#xff0c;您需要对Linux源码安装有一定的了解&#xff0c;如果您对此还存在困惑&#xff0c;欢迎查阅我博客内的其他文章&#xff0c;相信您一定会有所收获&#xff01; LAMP源码…

Ubuntu安装LAMP

在安装vim时遇到了一个问题&#xff1a; E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用) E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend)&#xff0c;是否有其他进程正占用它&#xff1f; 解决办法&#xff1a;强制解锁 sudo rm /var/li…