JavaScript之Proxy详解

文章的更新路线:JavaScript基础知识-Vue2基础知识-Vue3基础知识-TypeScript基础知识-网络基础知识-浏览器基础知识-项目优化知识-项目实战经验-前端温习题(HTML基础知识和CSS基础知识已经更新完毕)

正文

Proxy是JavaScript中的一个强大而灵活的特性,它允许你创建一个代理对象,可以拦截并改变对象的底层操作。

1. Proxy的基本概念

1.1 什么是Proxy

Proxy是ES6引入的一个新对象,用于创建一个对象的代理,可以拦截并重定义基本的操作。

1.2 创建一个简单的Proxy

const target = {
  name'Alice',
  age30
};

const handler = {
  getfunction (target, prop{
    console.log(`Getting property "${prop}"`);
    return target[prop];
  }
};

const proxy = new Proxy(target, handler);

console.log(proxy.name); // 输出: Getting property "name", 然后输出 "Alice"

2. Proxy的拦截操作

2.1 拦截操作种类

Proxy可以拦截的操作包括:getsethasdeletePropertyapply等。

2.2 示例

const target = {
  name'Alice',
  age30
};

const handler = {
  getfunction (target, prop{
    console.log(`Getting property "${prop}"`);
    return target[prop];
  },
  setfunction (target, prop, value{
    console.log(`Setting property "${prop}" to "${value}"`);
    target[prop] = value;
  }
};

const proxy = new Proxy(target, handler);

proxy.name; // 输出: Getting property "name", 然后输出 "Alice"
proxy.age = 31// 输出: Setting property "age" to "31"

3. Proxy的应用场景

3.1 数据绑定

通过Proxy可以实现数据绑定,监听对象属性的变化。

const user = {
  name'Alice',
  age30
};

const handler = {
  setfunction (target, prop, value{
    console.log(`Setting property "${prop}" to "${value}"`);
    target[prop] = value;
    // 触发更新逻辑,比如更新UI
  }
};

const reactiveUser = new Proxy(user, handler);

reactiveUser.age = 31// 输出: Setting property "age" to "31"

3.2 数据校验

可以使用Proxy在设置属性值时进行校验,确保数据的合法性。

const person = {
  name'Alice',
  age30
};

const handler = {
  setfunction (target, prop, value{
    if (prop === 'age' && (typeof value !== 'number' || value < 0)) {
      throw new Error('Invalid age value');
    }
    target[prop] = value;
  }
};

const validatedPerson = new Proxy(person, handler);

validatedPerson.age = 31// 合法
validatedPerson.age = -1// 抛出Error: Invalid age value

3.3 懒加载

使用Proxy可以实现对象属性的懒加载,只在访问时才进行实际的计算或获取。

const lazyLoader = {
  datanull,
  getData() {
    // 实际的数据加载逻辑
    console.log('Loading data...');
    this.data = { /* 数据内容 */ };
    return this.data;
  }
};

const lazyProxy = new Proxy(lazyLoader, {
  get(target, key) {
    if (!target.data) {
      target.getData();
    }
    return target.data[key];
  }
});

console.log(lazyProxy.name); // 加载数据后输出数据的name属性

3.4 不可遍历的属性

使用for...in循环或Object.keys方法时,Proxy默认会被视为不可遍历。

const target = { name'John' };
const proxy = new Proxy(target, {});

for (const key in proxy) {
  console.log(key); // 不会输出任何内容
}

4. Proxy的优缺点

4.1 优点

  • 灵活性: Proxy提供了丰富的拦截操作,使得我们能够对对象的行为进行灵活的定制。
  • 可读性: 通过 Proxy能够实现更清晰和易读的代码,避免了传统的一些hack手段。

4.2 缺点

  • 兼容性: Proxy是ES6引入的特性,不支持ES6的环境无法使用。
  • 性能开销: 由于 Proxy可以拦截多种操作,可能对性能产生一定的开销。在性能敏感的场景需要谨慎使用。

结论

Proxy是JavaScript中强大而灵活的特性,适用于许多场景,如数据绑定、数据校验等。它为开发者提供了一种更优雅和清晰的代码实现方式,但在使用时需要注意兼容性和性能开销。深入理解Proxy的特性和应用场景,有助于更好地利用它提供的强大功能。

结束语

今天分享,有需要的自行获取(回复 11)。

alt

本文由 mdnice 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【我的代码生成器】生成React页面类

有了数据表的结构信息&#xff0c;就能生成React 的页面类&#xff0c;快捷方便。 生成界面如下&#xff1a; 生成的React FrmUser.js页面如下&#xff1a; 只需再写里面的操作逻辑代码。

【计算机考研】跨考408直接看王道,不看教材可行吗?

一般备考都不会看教材的&#xff01;如果时间特别充足可以看一下教材 王道的四件套无疑是大多数同学的首选。相比其他课程来说&#xff0c;也是属于市面上最好的408课程了。 从今年的难度来看选择题部分和计网&#xff0c;比起往年来看是有很多偏题&#xff0c;大题除了计网的…

zabbix 使用 dataease 做数据大屏

1、环境介绍 操作系统&#xff1a;龙蜥os 7.9 软件&#xff1a;dataease v1.18.18 zabbix&#xff1a; 6.0 2、软件下载 https://community.fit2cloud.com/#/products/dataease/downloads 3、将软件包上传到服务器并解压缩 tar -xvf dataease-v1.18.18-offline.tar.gz4、修改…

【Java框架】Mybatis教程(一)——环境搭建及基本CRUD操作

目录 持久化与ORMORM&#xff08;Object Relational Mapping&#xff09;ORM解决方案包含下面四个部分 MyBatis简介特点MyBatis框架优缺点优点缺点 搭建MyBatis开发环境步骤1. 创建Maven工程&#xff0c;导入MyBatis依赖的组件2. 编写MyBatis核心配置文件(mybatis-config.xml)示…

ubuntu22安装snipaste

Ubuntu 22.04 一、Snipaste 介绍和下载 Snipaste 官网下载链接: Snipaste Downloads 二、安装并使用 Snipaste # 1、进入Snipaste-2.8.9-Beta-x86_64.AppImage 目录&#xff08;根据自己下载目录&#xff09; cd /home/jack/Downloads/softwares/AppImage# 2、Snipaste-2.8.9-…

Docker镜像,什么是Docker镜像,Docker基本常用命令

docker镜像 1.1什么是镜像&#xff0c;镜像基础 1.1.1 镜像的简介 镜像是一种轻量级&#xff0c;可执行的独立软件包&#xff0c;也可以说是一个精简的操作系统。镜像中包含应用软件及应用软件的运行环境&#xff0c;具体来说镜像包含运行某个软件所需的所有内容&#xff0c;…

html--烟花3

html <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Canvas烟花粒子</title> <meta name"keywords" content"canvas烟花"/> <meta name"description" content"can…

代码学习记录42---动态规划

随想录日记part42 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.14 主要内容&#xff1a;今天开始要学习动态规划的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;最长递增子序列 &#xff1b;最长连续递增序列 &#xff1b;最长重复子数组 ;最长公…

mac基础操作、快捷、软件快捷方式

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 mac基础操作、快捷、软件快捷方式 前言mac快捷操作快捷查找切换页面页面缩略访达和命令端切换创建文件夹创建文件删除文件/文件夹获取文件的路径移动文件或文件夹复制文件命令端常用命令 前言 主要是方…

B端:请说出你的设计依据,咋办?来吧,尼尔森法则告诉他。

在B端界面设计中&#xff0c;客户经常会问这样设计的依据是什么&#xff0c;许多设计师回答不上来&#xff0c;或者是答非所问&#xff0c;流于表面&#xff0c;这是时候就需要请出来尼尔森用户体验设计的十大法则&#xff0c;那么问题来了&#xff0c;如何让这10大法则和界面相…

Python学习笔记23 - 目录操作

os模块操作目录相关函数 os.path模块操作目录相关函数 案例1 —— 列出指定目录下的所有.py文件 案例2 —— walk()

论文笔记:NEFTune: Noisy Embeddings Improve Instruction Finetuning

iclr 2024 reviewer 评分 5666 1 论文思路 论文的原理很简单&#xff1a;在finetune过程的词向量中引入一些均匀分布的噪声即可明显地提升模型的表现 2 方法评估

c# .net 香橙派 Orangepi GPIO高低电平、上升沿触发\下降沿触发 监听回调方法

c# .net 香橙派GPIO高低电平、上升沿触发\下降沿触发 监听回调方法 通过gpio readall 查看 gpio编码 这里用orangepi zero3 ,gpio= 70为例 当gpio 70 输入高电平时,触发回调 c# .net 代码 方法1: Nuget 包 System.Device.Gpio ,微软官方库对香橙派支持越来越好了,用得…

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024)

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024) 会议简介 2024年国际文化、历史、人文、艺术与社会发展会议&#xff08;CHHASD2024&#xff09;将在中国武汉举行&#xff0c;主题为“文化、历史&#xff0c;人文、艺术和社会发展”。CHHASD2024汇集了来自世界各…

c++中常用库函数

大小写转换 islower/isupper函数 char ch1 A; char ch2 b;//使用islower函数判断字符是否为小写字母 if(islower(ch1)){cout << ch1 << "is a lowercase letter." << end1; } else{cout << ch1 << "is not a lowercase lette…

图形学基础:二维三维刚体的移动、缩放和旋转矩阵

一、二维 1.1 缩放矩阵 x&#xff0c;y分别表示在x轴&#xff0c;y轴缩放的倍数 示例&#xff1a; 点(2,1)在x&#xff0c;y轴上分别缩放x倍&#xff0c;y倍 1.2 平移矩阵 x&#xff0c;y分表表示在x轴&#xff0c;y轴上移动的距离 示例&#xff1a;点&#xff08;2,1&#xf…

AI天使汇联合150家顶级基金、战投,征集优秀AI创业项目

鉴于AI天使汇主办的2024年3月期优秀项目征集活动效果超出预期&#xff0c;3月活动最后TOP20路演者中已有多家快速拿到了TS。 路演活动质量受到了AI创业公司和基金/战投伙伴的高度评价&#xff0c;现在开始四月期活动报名! 本期征集活动联合的顶级基金和战投数量增加到了150家…

LabVIEW无线快速存取记录器(WQAR)测试平台

LabVIEW无线快速存取记录器&#xff08;WQAR&#xff09;测试平台 随着民用航空业的迅速发展&#xff0c;航空安全的保障日益成为公众和专业领域的关注焦点。无线快速存取记录器&#xff08;WirelessQuick Access Recorder, WQAR&#xff09;作为记录飞行数据、监控飞行品质的…

使用这几款插件,GitHub阅读代码效率噌噌噌

** octotree&#xff1a;生成仓库目录 ** 这可能是我用得最多的一款插件了&#xff0c;大家有没有遇到过这种情况。每次点击一个文件后&#xff0c;整个文件列表就会被隐藏&#xff0c;想查看其它文件只能回退后再次进入。别提有多蛋疼了…… 而这款插件就完美解决了这个问题…

Day101:漏洞发现-漏扫项目篇NucleiYakitGobyAfrogXrayAwvs联动中转被动

目录 特征类-三方Poc调用&模版Poc调用 案例1&#xff1a;单点对某特征点进行安全评估 Goby-综合类 Nuclei-较综合类 Afrog-特征类 Yakit-可特征可综合 案例2&#xff1a;新型对某特征点进行安全评估 综合类-主动漏扫&中转联动&被动联动 案例1&#xff1a;…