Proxy、Reflect和WeakMap

2024-04-03 17:52
文章标签 proxy reflect weakmap

本文主要是介绍Proxy、Reflect和WeakMap,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Proxy、Reflect和WeakMap是ES6中引入的三个新的JavaScript特性。

Proxy

Proxy对象用于定义基本操作的自定义行为(例如属性查找、赋值、枚举、函数调用等)。

const handler = {get(target, prop, receiver) {console.log(`GET ${prop}`);return Reflect.get(target, prop, receiver);},set(target, prop, value, receiver) {console.log(`SET ${prop} = ${value}`);return Reflect.set(target, prop, value, receiver);}
};
const target = { foo: 'bar' };
const proxy = new Proxy(target, handler);
proxy.foo; // 控制台输出: GET foo
proxy.foo = 'baz'; // 控制台输出: SET foo = baz

在上面的例子中,handler对象定义了getset陷阱,这些陷阱会在对应的操作发生时被调用。Proxy对象proxy拦截了对target对象的属性访问和赋值操作,并打印出相应的信息。

Reflect

Reflect是一个内置的对象,它提供拦截JavaScript操作的方法。这些方法与Proxy对象的陷阱方法相同。Reflect不是一个函数对象,因此它是不可构造的。

const obj = {foo: 1,bar: 2,get baz() {return this.foo + this.bar;}
};
console.log(Reflect.get(obj, 'foo')); // 1
console.log(Reflect.set(obj, 'foo', 3)); // true
console.log(obj.foo); // 3

在上面的例子中,Reflect.get()Reflect.set()被用来获取和设置obj对象的属性。

WeakMap

WeakMap是一种特殊的Map,只接受对象作为键名(null除外),并且键名所指向的对象不计入垃圾回收机制。

const weakMap = new WeakMap();
const obj1 = {};
const obj2 = {};
weakMap.set(obj1, 'hello');
weakMap.set(obj2, 'world');
console.log(weakMap.get(obj1)); // 'hello'
console.log(weakMap.get(obj2)); // 'world'
// 当obj1和obj2被清除后,weakMap中的条目也会自动被清除
obj1 = null;
obj2 = null;

在上面的例子中,weakMap是一个WeakMap实例,它使用了obj1obj2作为键名。当obj1obj2被设置为null后,它们可以被垃圾回收器回收,weakMap中对应的条目也会被自动清除。
这三个特性结合起来,可以用于实现私有变量、函数柯里化、数据绑定等高级功能。例如,结合ProxyWeakMap可以实现一个简单的私有属性存储方案:

const privateData = new WeakMap();
class Person {constructor(name, age) {privateData.set(this, { name, age });}get name() {return privateData.get(this).name;}get age() {return privateData.get(this).age;}
}
const person = new Person('Alice', 25);
console.log(person.name); // 'Alice'
console.log(person.age); // 25

在这个例子中,privateData是一个WeakMap,用于存储每个Person实例的私有数据。由于WeakMap的键名是弱引用,所以当Person实例被垃圾回收时,对应的私有数据也会被自动清除。

这篇关于Proxy、Reflect和WeakMap的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/873587

相关文章

Michael.W基于Foundry精读Openzeppelin第59期——Proxy.sol

Michael.W基于Foundry精读Openzeppelin第59期——Proxy.sol 0. 版本0.1 Proxy.sol 1. 目标合约2. 代码精读2.1 _delegate(address implementation) internal2.2 _implementation() internal && _beforeFallback() internal2.3 fallba

Nginx Proxy Manager反向代理Jackett

1 说明 最近折腾nas,发现npm反向代理Jackett后出现无法访问的问题,是因为外网访问jackett (例如https://domain.com:7373/jackett/UI/Dashboard)时,url会被重定向到https://domain.com/jackett/UI/Login?ReturnUrl=%2Fjackett%2FUI%2FDashboard,如此一来,原来的por

解决nginx使用proxy_pass反向代理时,session cookie丢失的问题

今天在看sso(单点登录)时,看到了这篇文章,nginx反向代理解决cookie带不过去的问题,关键点是加上 proxy_cookie_path(路径转换),下面是正文: ------------------------------------------------------------------------------------------- 1. 如果只是host、端口转换,则co

tomcat学习(五) 使用apache httpd的mod_proxy实现tomcat反向代理以及负载均衡

mod_jk只能反代AJP,配置复杂一些,不做介绍,这里介绍使用mod_proxy反代 1、安装httpd yum install httpd 2、查看httpd proxy模块有没有启动 httpd -M 这里安装的是2.4.6版,已经启动,不用额外启用 3、配置httpd cd /etc/httpd/confgedit httpd.conf 添加配置 Proxy

Reverse-Proxy微软开源:高效构建HTTP反向代理的利器

Reverse-Proxy: 简化你的网络架构,用微软的反向代理加速你的服务。- 精选真开源,释放新价值。 概览 微软的reverse-proxy项目是一个高性能的HTTP反向代理应用程序开发工具包。它提供了一种灵活的方式来构建能够处理大量并发连接的代理服务。这个工具包不仅能够转发请求,还能够提供负载均衡、SSL终端、缓存和其他高级功能,使其成为构建现代微服务架构和云原生应用的理想选择。

charles 常用方法(七)屏蔽web网页的抓包信息(proxy)

应用场景:屏蔽web网页的抓包信息 proxy-->windows proxy(前面没有对勾,就不会抓到 PC浏览器的包) proxy-->macOS proxy(mac电脑)

Shardingsphere-Proxy 5.5.0部署

Shardingsphere-Proxy 5.5.0部署 Shardingsphere系列目录:背景下载安装包Linux解压安装包修改配置文件global.yamldatabase-sharding.yaml 引入数据库驱动启动代理连接代理数据库Navicate工具连接MYSQL客户端连接 Shardingsphere系列目录: 【Springboot 集成 Shardings

Nginx Proxy 代理测试

目录 https://blog.csdn.net/Lzcsfg/article/details/139781909 一. 实验准备 二. 配置反向代理 三. 配置二层代理 解释流程 一. 实验准备 关闭防火墙和selinux,准备三台同一网段的虚拟机 localhostRoucky_linux9.4192.168.226.20localhostRoucky_linux9.4

解决:Error:Connection timed out: connect. If you are behind an HTTP proxy, please

android 2.0以后,涌现该题目的缘由是as拜访https://services.gradle.org/distributions/gradle-xxx.zip下失败 解决方案: 1、settings->Build,Execution,Deployment->Build Tools->Gradle->Use local gradle distribution->Gradle home

Spring(十)通过动态代理(JDK的Proxy)和cglib实现AOP技术

目标对象的所有接口方法 package test.spring.service;public interface PersonService {public String getPersonName(Integer id);public void save(String name);} 目标对象 package test.spring.service.impl;import tes