ES6之Proxy详解

news2024/11/28 9:44:44

✨ 专栏介绍

在现代Web开发中,JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性,还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言,JavaScript具有广泛的应用场景,并且不断发展演进。在本专栏中,我们将深入学习JavaScript语言的基本语法、DOM操作、事件处理、异步编程以及常见算法和数据结构等内容。此外,我们还将介绍ES6及其后续版本中引入的新特性,如箭头函数、模块化、解构赋值等。通过学习这些内容,你将能够成为一名熟练的JavaScript开发者,并能够应用这些知识来构建出高质量和可维护的Web应用程序。让我们一起开始JavaScript之旅吧!

在这里插入图片描述

文章目录

    • ✨ 专栏介绍
    • 概念
    • Proxy属性操作介绍
    • 一些常用的Proxy属性用法示例
      • get(target, prop, receiver)
      • set(target, prop, value, receiver)
      • has(target, prop)
      • deleteProperty(target, prop)
      • apply(target, thisArg, argumentsList)
      • construct(target, argumentsList, newTarget)
      • getPrototypeOf(target)
      • setPrototypeOf(target, prototype)
    • 总结
    • 😶 写在结尾


在这里插入图片描述

概念

ES6中的Proxy是一种用于创建代理对象的特殊对象。它允许我们定义自定义行为,例如拦截和修改对象的默认操作。Proxy可以用于拦截对象的各种操作,包括属性访问、赋值、函数调用等。

Proxy的作用是在目标对象之前架设一层拦截,可以对目标对象进行各种操作的拦截和自定义处理。通过使用Proxy,我们可以实现对目标对象的访问控制、数据验证、属性劫持等功能。

Proxy通过使用一个代理对象来包装目标对象,并提供了一组钩子函数(也称为“陷阱”),这些钩子函数可以在代理对象上进行操作。当我们对代理对象进行操作时,实际上是在调用这些钩子函数,并根据需要进行相应的处理。

Proxy属性操作介绍

  • get(target, propKey, receiver) :拦截对象属性的读取

  • set(target, propKey, value, receiver) :拦截对象属性的设置返回一个布尔值。

  • 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)

一些常用的Proxy属性用法示例

get(target, prop, receiver)

  • 作用:拦截对目标对象属性的读取操作。

  • 参数:

    • target:目标对象。
    • prop:要访问的属性名。
    • receiver:代理对象本身(或者说是拦截操作所在的环境)。
  • 示例:

    const target = {
      name: 'Alice',
      age: 25
    };
    const proxy = new Proxy(target, {
      get(target, prop) {
        console.log(`Getting ${prop}`);
        return target[prop];
      }
    });
    
    console.log(proxy.name); // 输出:Getting name,Alice
    

set(target, prop, value, receiver)

  • 作用:拦截对目标对象属性的赋值操作。

  • 参数:

    • target:目标对象。
    • prop:要设置的属性名。
    • value:要设置的值。
    • receiver:代理对象本身(或者说是拦截操作所在的环境)。
  • 示例:

    const target = {
      name: 'Alice',
      age: 25
    };
    
    const proxy = new Proxy(target, {
      set(target, prop, value) {
        console.log(`Setting ${prop} to ${value}`);
        target[prop] = value;
        return true;
      }
    });
    
    proxy.age = 30; // 输出:Setting age to 30
    console.log(proxy.age); // 输出:30
    

has(target, prop)

  • 作用:拦截对in操作符的操作,判断属性是否存在。

  • 参数:

    • target:目标对象。
    • prop:要判断的属性名。
  • 示例:

    const target = {
      name: 'Alice',
      age: 25
    };
    
    const proxy = new Proxy(target, {
      has(target, prop) {
        console.log(`Checking if ${prop} exists`);
        return prop in target;
      }
    });
    
    console.log('name' in proxy); // 输出:Checking if name exists,true
    console.log('gender' in proxy); // 输出:Checking if gender exists,false
    

deleteProperty(target, prop)

  • 作用:拦截对delete操作符的操作,删除属性。

  • 参数:

    • target:目标对象。
    • prop:要删除的属性名。
  • 示例:

    const target = {
      name: 'Alice',
      age: 25
    };
    
    const proxy = new Proxy(target, {
      deleteProperty(target, prop) {
        console.log(`Deleting ${prop}`);
        delete target[prop];
        return true;
      }
    });
    
    delete proxy.age; // 输出:Deleting age console.log(proxy.age); // 输出:undefined
    

apply(target, thisArg, argumentsList)

  • 作用:拦截对代理对象的函数调用。

  • 参数:

    • target:目标对象。
    • thisArg:函数调用时的this值。
    • argumentsList:函数调用时的参数列表。
  • 示例:

    const target = function (name) {
      console.log(`Hello, ${name}`);
    };
    
    const proxy = new Proxy(target, {
      apply(target, thisArg, argumentsList) {
        console.log('Calling function');
        return target.apply(thisArg, argumentsList);
      }
    });
    
    proxy('Alice'); // 输出:Calling function,Hello, Alice
    

construct(target, argumentsList, newTarget)

  • 作用:拦截对代理对象的构造函数调用。

  • 参数:

    • target:目标对象。
    • argumentsList:构造函数调用时的参数列表。
    • newTarget:最初被调用的构造函数。
  • 示例:

const target = function (name) {
  this.name = name;
};

const proxy = new Proxy(target, {
  construct(target, argumentsList) {
    console.log('Constructing object');
    return new target(...argumentsList);
  }
});

const obj = new proxy('Alice'); // 输出:Constructing object
console.log(obj.name); // 输出:Alice

getPrototypeOf(target)

  • 作用:拦截对代理对象原型链上属性访问操作。

  • 参数:

    • target:目标对象。
  • 示例:

const target = {};
const proxy = new Proxy(target, {
getPrototypeOf(target) {
console.log('Getting prototype');
return Object.getPrototypeOf(target);
}
});

console.log(Object.getPrototypeOf(proxy)); // 输出:Getting prototype,{}

setPrototypeOf(target, prototype)

  • 作用:拦截对代理对象原型链上属性设置操作。
  • 参数:
    • target:目标对象。
    • prototype:要设置的原型对象。
  • 示例:
const target = {}
const proxy = new Proxy(target, {
  setPrototypeOf(target, prototype) {
    console.log('Setting prototype')
    return Object.setPrototypeOf(target, prototype)
  }
})

const proto = { name: 'Alice' }
Object.setPrototypeOf(proxy, proto) // 输出:Setting prototype
console.log(proxy.name) // 输出:Alice

这些是Proxy的一些常用属性用法,通过定义这些属性,我们可以对代理对象的各种操作进行拦截和自定义处理。在实际应用中,我们可以根据需要选择合适的属性来实现特定的功能。

总结

Proxy是ES6中的一个重要特性,它提供了一种拦截和修改对象默认操作的能力。通过使用Proxy,我们可以实现访问控制、数据验证、属性劫持等功能。Proxy的原理是通过在代理对象上定义一组钩子函数来实现拦截和自定义处理。在实际应用中,我们可以根据需要使用Proxy来解决各种问题,提高代码的灵活性和可维护性。


😶 写在结尾

前端设计模式专栏
在这里插入图片描述
设计模式是软件开发中不可或缺的一部分,它们帮助我们解决了许多常见问题,并提供了一种优雅而可靠的方式来构建应用程序。在本专栏中,我们介绍了所有的前端设计模式,包括观察者模式、单例模式、策略模式等等。通过学习这些设计模式,并将其应用于实际项目中,我们可以提高代码的可维护性、可扩展性和可重用性。希望这个专栏能够帮助你在前端开发中更好地应用设计模式,写出高质量的代码。点击订阅前端设计模式专栏

Vue专栏
在这里插入图片描述
Vue.js是一款流行的JavaScript框架,用于构建用户界面。它采用了MVVM(Model-View-ViewModel)的架构模式,通过数据驱动和组件化的方式,使开发者能够更轻松地构建交互性强、可复用的Web应用程序。在这个专栏中,我们将深入探讨Vue.js的核心概念、组件开发、状态管理、路由和性能优化等方面的知识。我们将学习如何使用Vue.js构建响应式的用户界面,并探索其强大的生态系统,如Vue Router和Vuex、Pinia。通过学习这些内容,你将能够成为一名熟练的Vue.js开发者,并能够应用这些知识来构建复杂而高效的Web应用程序。点击订阅Vue专栏

JavaScript(ES6)专栏在这里插入图片描述
JavaScript是一种广泛应用于网页开发和后端开发的脚本语言。它具有动态性、灵活性和易学性的特点,是构建现代Web应用程序的重要工具之一。在这个专栏中,我们将深入探讨JavaScript语言的基本语法、DOM操作、事件处理、异步编程以及常见算法和数据结构等内容。此外,我们还将介绍ES6(ECMAScript 2015)及其后续版本中引入的新特性,如箭头函数、模块化、解构赋值等。通过学习这些内容,你将能够成为一名熟练的JavaScript开发者,并能够应用这些知识来构建出高质量和可维护的Web应用程序。点击订阅JavaScript(ES6)专栏

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

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

相关文章

虚拟专线网络(IP-VPN)

虚拟专线网络(IP-VPN),因为它的安全性和可靠性。通过亚洲领先的 IP VPN 提供商。享受更高的可管理性和可扩展性,在多个站点之间交付 IP 流量或数据包,拥有亚太地区最大的 IP 骨干网。 1,保证正常运行时间,在网络链路发…

设计模式设计原则——依赖倒置原则(DIP)

DIP:Dependence Inversion Principle 原始定义:High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions。 官…

合伙企业有哪些分类

合伙企业分为:普通合伙企业和有限合伙企业。其中,普通合伙企业又包含特殊的普通合伙企业。 1、普通合伙企业由2人以上普通合伙人(没有上限规定)组成。 普通合伙企业中,合伙人对合伙企业债务承担无限连带责任。 特殊的普通合伙企业中&#xf…

docker 在线安装mysql 8.0.21版本

1、拉取mysql 8.0.21版本镜像 2、查看镜像 docker images 3、在宿主机 /usr/local/mysql 下的 conf 文件夹下,创建 my.cnf 文件,并编辑内容 [mysql] default-character-setutf8 [client] port3306 default-character-setutf8 [mysqld] port3306 se…

【基础篇】五、类的双亲委派机制

文章目录 1、双亲委派机制2、Java代码中去主动加载一个类3、“父”加载器4、Q & A5、打破双亲委派机制 1、双亲委派机制 JVM中有多个类加载器,某个类A,到底该由谁去加载 ⇒ 双亲委派机制 该机制的作用: 保证类加载的安全性:避…

VMvare虚拟机中文件夹共享防火墙设置

目录 一、虚拟机jdk及tomcat配置 1.1 JDK配置 1.2 tomcat配置 二、文件夹共享 2.1 为什么需要配置文件夹共享功能 2.2 高级共享和普通共享 三、防火墙设置 入站规则和出站规则 四、思维导图 一、虚拟机jdk及tomcat配置 1.1 JDK配置 (1) 双击jdk (2&#xf…

个体诊所软件方案,农村医疗服务站社区门诊电子处方管理系统软件教程

个体诊所软件方案,农村医疗服务站社区门诊电子处方管理系统软件教程 一、软件程序问答 1、处方单软件有病历汇总吗 如下图,软件以 佳易王电子处方软件V17.2版本为例说明 点击 病历汇总统计 按钮, 可以按明细查询或病历汇总查询&#xf…

交通 | 司乘匹配:基于增量成本计算的优化算法

编者按: 司乘匹配是打车服务中一项至关重要的任务,如果这一步做得不够优化,可能导致乘客需要更长的时间才能到达目的地,同时司机的收入也会因此减少。由于司乘匹配是一个持续进行的过程,每一时刻都在不断涌入新的打车…

MD5算法

一、引言 MD5(Message-Digest Algorithm 5)是一种广泛应用的密码散列算法,由Ronald L. Rivest于1991年提出。MD5算法主要用于对任意长度的消息进行加密,将消息压缩成固定长度的摘要(通常为128位)。在密码学…

微信小程序开发系列-11组件间通信02

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》 《微信小程序开发系列-02注册小程序》 《微信小程序开发系列-03全局配置中的“window”和“tabBar”》 《微信小程序开发系列-04获取用户图像和昵称》 《微信小程序开发系列-05登录小程序》 《…

图文证明 等价无穷小替换

等价无穷小替换 定义 等价无穷小是无穷小之间的一种关系,指的是:在同一自变量的趋向过程中,若两个无穷小之比的极限为1,则称这两个无穷小是等价的。无穷小等价关系刻画的是两个无穷小趋向于零的速度是相等的。 设当 x → x 0 时…

[python]matplotlib

整体图示 .ipynb 转换md时候图片不能通知携带&#xff0c;所有图片失效&#xff0c;不过直接运行代码可以执行 figure figure,axes与axis import matplotlib.pyplot as plt figplt.figure() fig2plt.subplots() fig3,axsplt.subplots(2,2) plt.show()<Figure size 640x480 …

大数据 - Hadoop系列《二》- Hadoop组成

目录 &#x1f436;3.1 hadoop组成 &#x1f436;3.1 HDFS 架构概述 1. NameNode&#xff08;nn&#xff09;&#xff1a; ​编辑2. DataNode(dn)&#xff1a; 3. Secondary NameNode(2nn)&#xff1a; &#x1f436;3.2 YARN 架构概述 &#x1f436;3.3 MapReduce 架构…

Vue Tinymce富文本组件添加自定义字体项

实现效果如下&#xff1a; Tinymce 组件进行字体设置 设置完后&#xff0c;就可以使用自定义的字体了。

[Mac软件]ColorWell For Mac 7.4.0调色板生成器

美丽而直观的调色板和调色板生成器是任何Web或应用程序开发人员工具包的必要补充&#xff01; 创建无限数量的调色板&#xff0c;快速访问所有颜色信息和代码生成&#xff0c;用于应用程序开发&#xff0c;非常简单。可编辑调色板数据库允许您存档和恢复任何调色板&#xff0c…

Django 学习教程-介绍与安装

系列 Django 学习教程- Hello world入门案例-CSDN博客 介绍 Django 是一个由 Python 编写用于Web 应用程序开发的高级 Python Web 框架 Django 提供了一套强大的工具&#xff08;无需重新发明轮子&#xff09;&#xff0c;使得开发者能够快速构建 Web 网站。 Django 采用了…

在线课程学习管理

### 起步1. 使用 IDEA 导入项目 2. 执行 sql 目录下的online_study_system.sql 文件 3. 修改 mysql.properties 中数据库连接信息 4. 运行程序| 用户名| 密码 | | ------------- |:-------------| | admin | 123 | | 李老师 | 123 | | 张老师 | 123 | | 刘老师 | 123 | | 曹老师…

javaWeb商城2

一、家居电子商城 线上电子商城系统&#xff0c;主要实现了用户注册&#xff0c;登录、浏览&#xff0c;查看家居商品信息&#xff0c;购物车&#xff0c;订单&#xff0c;支付&#xff0c;查看通知以及管理员对用户信息的管理&#xff0c;订单管理&#xff0c;商品管理&#…

基于Java SSM框架实现医院挂号系统项目【项目源码+论文说明】

基于java的SSM框架实现医院挂号上班打卡系统演示 摘要 在网络发展的时代&#xff0c;国家对人们的健康越来越重视&#xff0c;医院的医疗设备更加先进&#xff0c;医生的医术、服务水平也不断在提高&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个…

给零基础朋友的编程课09 上集 - 代码

给零基础朋友的编程课09 上 - 矩形、曲线、文字、案例5讲解 上_哔哩哔哩_bilibili 上半Code: / // 彩色案例 艺术仿制品4 // /// 色表 // // 238,150,43 橙 // 229,207,192 暖灰 // 204,50,47 暗红// 项目设定 size(825, 984); // 设置画布(窗口)尺寸 background(…