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

相关文章

proxy代理解决vue中跨域问题

vue.config.js module.exports = {...// webpack-dev-server 相关配置devServer: {host: '0.0.0.0',port: port,open: true,proxy: {'/api': {target: `https://vfadmin.insistence.tech/prod-api`,changeOrigin: true,p

【上】java获取requestMapping上所有注解功能实现及取匿名注释类的值及 class com.sun.proxy.$Proxy140 转换出错

java获取requestMapping上所有注解功能实现及取匿名注释类的值及 class com.sun.proxy.$Proxy140 转换出错 1,多人相当然以为类似对象一样直接强转下就可以,结果迎来的是class com.sun.proxy.$Proxy140转换出错【想法很勇敢,现实很骨感】 //Class<A> operatorMappingAnnotationType// 错误

Nginx location 和 proxy_pass 配置详解

概述 Nginx 配置中 location 和 proxy_pass 指令的不同组合方式及其对请求转发路径的影响。 配置效果 1. location 和 proxy_pass 都带斜杠 / location /api/ {proxy_pass http://127.0.0.1:8080/;} 访问地址:www.hw.com/api/upload转发地址:http://127.0.0.

ES6基础----Reflect的使用

目录   Reflect 是 ES6 提出的针对对象操作的 API,目的是为了让对象的操作变为函数式,更加统一规范,后续新增的对象方法将放在 Reflect 1、 向对象中添加属性及内容     --添加和重名修改 2、得到对象的属性及内容 3、删除对象的属性及内容    --返回布尔值 4、判断对象的属性是否存在   ---返回布尔值   Reflect 是 ES6 提出的针

Vue3 中的响应式系统:深入理解 Proxy API

在Vue 3中,响应式系统的核心是通过使用ES6中的Proxy API来创建数据的代理,从而拦截对象属性的读取和设置操作。这使得框架可以在属性被访问或修改时执行额外的操作,例如触发视图更新。 下面是一个简单的例子,展示如何使用Proxy来创建一个响应式对象: function reactive(target) {   // 使用WeakMap来存储原始对象到Proxy的映射   const

Go游戏服务器开发的一些思考(三十九):go reflect的正确使用方法

错误的使用 go reflect包,在写一些通用库、通用模块时,提供了不少便利。 但是需要注意,go reflect包是非常慢的! 下图,就是一次失败使用go reflect包的尝试: (CStructGO 是 本人使用go reflect包写的一个C-Style Struct协议库:cstruct-go) 可以看到,同样的功能,cstruct-go比protobuf慢了一个数量级。

qt6 socket 不使用代理 socket error: The proxy type is invalid for this operation

qt 5.8之后,socket默认使用代理 参考 https://www.cnblogs.com/cppskill/p/11730452.html#:~:text=%E5%9C%A8%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E9%87%8C%E5%AE%9A%E4%B9%89,Proxy%29%3B%E3%80%82 #include <QNetworkProx

ES6更新的内容中什么是proxy

Proxy 是 ES6(ECMAScript 2015)中引入的一个新的内置对象,用于定义某些操作的自定义行为(如属性查找、赋值、枚举、函数调用等)。Proxy 可以被看作是一个拦截器,它拦截并自定义对象上的基本操作。通过创建一个对象的 Proxy,你可以控制对这个对象的访问,包括读取属性、设置属性、枚举属性、函数调用等。 Proxy 接收两个参数: 目标对象(target):你想要拦截其操作

Error:Unable to tunnel through proxy. Proxy returns HTTP/1.1 400 Bad Request

遇到这中问题,请参照http://www.2cto.com/kf/201608/541098.html这里 并且查看你的项目的gradle-wrapper.properties, 最后一行gradle版本改为本地的,当然.gradle文件里面的gradle版本本地也要有

Design Pattern—— Dynamic Proxy Pattern(三) 动态代理模式

done by myself 通过下面例子,进一步演示 动态代理 的强大特性,将会体会到 相对于静态static代理,动态可实现 一个proxy代理不同的真实对象。灵活多变。只需要在Client类 调整要代理的角色,无需改动其他部分。使代理角色、真实角色的对应关系更松散了。 抽象角色: package com.proxy.severalCase;public interfa