JavaScript 中的 Reflect 详解
Reflect 是 ES6引入的一个内置对象,它提供了一系列静态方法来操作对象,这些方法与 Proxy 处理器方法一一对应。Reflect 的设计目的是为了更优雅地操作对象,并统一某些操作的行为。
1. Reflect 的基本特点
1. 不是构造函数:不能使用 new 操作符调用,也不能被当作函数调用;
2. 所有方法都是静态的:类似于 Math 对象;
3. 与 Proxy 方法一一对应:每个可被 Proxy 捕获的操作都有对应的 Reflect 方法;
2. Reflect 的主要方法
2.1. Reflect.apply(target, thisArgument, argumentsList)
等同于 Function.prototype.apply(),但作为函数调用而非方法调用。
function greet(name) {return `Hello, ${name}!`;
}console.log(Reflect.apply(greet, null, ['Alice'])); // "Hello, Alice!"
2.2. Reflect.construct(target, argumentsList[, newTarget])
类似于 new target(...args),但可以指定不同的原型。
class Person {constructor(name) {this.name = name;}
}const person = Reflect.construct(Person, ['Bob']);
console.log(person.name); // "Bob"
2.3. Reflect.defineProperty(target, propertyKey, attributes)
类似于 Object.defineProperty(),但返回布尔值表示是否成功。
const obj = {};
const success = Reflect.defineProperty(obj, 'prop', {value: 42,writable: false
});console.log(success); // true
console.log(obj.prop); // 42
2.4. Reflect.deleteProperty(target, propertyKey)
删除对象属性,替代 delete 操作符。
const obj = { x: 1, y: 2 };
const result = Reflect.deleteProperty(obj, 'x');console.log(result); // true
console.log(obj); // { y: 2 }
2.5. Reflect.get(target, propertyKey[, receiver])
获取对象属性值,类似于 target[propertyKey]。
const obj = { x: 1, y: 2 };
console.log(Reflect.get(obj, 'x')); // 1
2.6. Reflect.getOwnPropertyDescriptor(target, propertyKey)
类似于 Object.getOwnPropertyDescriptor()。
const obj = { x: 1 };
const desc = Reflect.getOwnPropertyDescriptor(obj, 'x');
console.log(desc.value); // 1
2.7. Reflect.getPrototypeOf(target)
类似于 Object.getPrototypeOf()。
const proto = {};
const obj = Object.create(proto);
console.log(Reflect.getPrototypeOf(obj) === proto); // true
2.8. Reflect.has(target, propertyKey)
检查属性是否存在,替代 in 操作符。
const obj = { x: 1 };
console.log(Reflect.has(obj, 'x')); // true
console.log(Reflect.has(obj, 'y')); // false
2.9. Reflect.isExtensible(target)
类似于 Object.isExtensible()。
const obj = {};
console.log(Reflect.isExtensible(obj)); // true
Object.preventExtensions(obj);
console.log(Reflect.isExtensible(obj)); // false
2.10. Reflect.ownKeys(target)
返回对象自身属性键(包括符号属性),类似于 Object.getOwnPropertyNames() + Object.getOwnPropertySymbols()。
const obj = {[Symbol('id')]: 123,name: 'Alice'
};
console.log(Reflect.ownKeys(obj)); // ["name", Symbol(id)]
2.11. Reflect.preventExtensions(target)
类似于 Object.preventExtensions(),但返回布尔值。
const obj = {};
console.log(Reflect.preventExtensions(obj)); // true
console.log(Reflect.isExtensible(obj)); // false
2.12. Reflect.set(target, propertyKey, value[, receiver])
设置对象属性值,类似于 target[propertyKey] = value。
const obj = {};
Reflect.set(obj, 'x', 1);
console.log(obj.x); // 1
2.13. Reflect.setPrototypeOf(target, prototype)
类似于 Object.setPrototypeOf(),但返回布尔值。
const proto = {};
const obj = {};
console.log(Reflect.setPrototypeOf(obj, proto)); // true
console.log(Reflect.getPrototypeOf(obj) === proto); // true
3. Reflect 的使用场景
3.1. 与 Proxy 配合使用
Reflect 方法与 Proxy 处理器方法一一对应,通常用于 Proxy 处理器中执行默认操作。
const handler = {get(target, prop, receiver) {console.log(`Getting property ${prop}`);return Reflect.get(target, prop, receiver);},set(target, prop, value, receiver) {console.log(`Setting property ${prop} to ${value}`);return Reflect.set(target, prop, value, receiver);}
};const proxy = new Proxy({}, handler);
proxy.x = 1; // 日志: Setting property x to 1
console.log(proxy.x); // 日志: Getting property x,然后输出 1
3.2. 替代某些 Object 方法
Reflect 方法提供了更一致的 API 设计,如返回布尔值而非抛出错误。
// 旧方式
try {Object.defineProperty(obj, 'prop', { value: 42 });// 成功
} catch (e) {// 失败
}// 新方式
if (Reflect.defineProperty(obj, 'prop', { value: 42 })) {// 成功
} else {// 失败
}
3.3. 函数式操作对象
Reflect 方法适合函数式编程风格,可以作为参数传递。
const operations = [[Reflect.set, 'x', 1],[Reflect.set, 'y', 2],[Reflect.deleteProperty, 'x']
];const obj = {};
operations.forEach(([op, ...args]) => op(obj, ...args));
console.log(obj); // { y: 2 }
4. Reflect 与 Object 方法的区别
1. 返回值更一致:许多 Reflect 方法返回布尔值表示操作是否成功,而 Object 方法可能抛出错误;
2. 函数式调用:Reflect 方法作为函数调用,而非对象方法;
3. 与 Proxy 对应:Reflect 方法与 Proxy 处理器方法一一对应;
5. 总结
Reflect 对象提供了一套操作 JavaScript 对象的标准化方法,它的设计使得对象操作更加一致和可靠。虽然许多功能可以通过其他方式实现,但 Reflect API 提供了更优雅和一致的解决方案,特别是在与 Proxy 配合使用时。
相关文章:
JavaScript 中的 Reflect 详解
Reflect 是 ES6引入的一个内置对象,它提供了一系列静态方法来操作对象,这些方法与 Proxy 处理器方法一一对应。Reflect 的设计目的是为了更优雅地操作对象,并统一某些操作的行为。 1. Reflect 的基本特点 1. 不是构造函数:不能使…...
【操作系统】linux常用命令
UP作为一个Linux系统练习两年半的个人练习生,今天分门别类地给大家整理一下常用的Linux命令,祝大家在Linux练习之路一帆风顺。 文件和目录操作 文件查看与编辑 文件查找 文件权限与所有权 进程管理 系统信息与监控 网络管理与诊断...
002 vue组件化编程
文章目录 一般方式全局组件局部组件 组件(Component)是Vue.js最强大的功能之一 组件也是一个Vue实例,也包括:data、methods、生命周期函数等 组件渲染需要html模板,所以增加了template属性,值就是HTML模板 …...
常见的 JavaScript 框架和库
在现代前端开发中,JavaScript框架和库成为了构建高效、可维护应用程序的关键工具。本文将介绍四个常见的JavaScript框架和库:React、Vue.js、Angular 和 Node.js,并探讨它们的特点、使用场景及适用场合。 1. React — 构建用户界面的JavaScri…...
005_循环结构
循环结构 循环结构的作用和应用场景for循环while循环for和while的使用规范do - while 死循环循环嵌套break、continueRandom生成随机数 循环结构的作用和应用场景 减少代码的重复编写、灵活的控制程序的执行 for循环 for (1初始化语句; 2循环条件; 3迭代语句){4循环体语句(重…...
1110+款专业网站应用程序UI界面设计矢量图标figma格式素材 Icon System | 1,100+ Icons Easily Customize
1110款专业网站应用程序UI界面设计矢量图标figma格式素材 Icon System | 1,100 Icons Easily Customize 产品特点 — 24 x 24 px 网格大小 — 2px 线条描边 — 所有形状都是基于矢量的 — 平滑和圆角 — 易于更改颜色 类别 🚨 警报和反馈 ⬆️ 箭头 &…...
leetcode 368. 最大整除子集 中等
给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足: answer[i] % answer[j] 0 ,或answer[j] % answer[i] 0 如果存在多个有效解子集&…...
项目总结之常问的一些问题
1.项目功能介绍,重难点 重难点: mock工具使用(涉及到的三方接口过多,由于网络等原因无法调通,所以测试的时候,采用mock工具来模拟返回接口真正调用后响应数据) 2.项目负责哪部分?…...
51单片机实现精确定时
一、51单片机代码 #include <reg52.h>sbit LED P3^3;extern bit b10Ms; extern bit b100Ms; extern bit b1S; extern bit b10S;void Timer0_Init() {TMOD | 0x01; // 设置定时器0为模式1TH0 (65536 - 1000) / 256; // 高8位赋初值TL0 (65536 - 1000) % 256; // 低8位…...
记一次不太顺利的Docker重装
#记录工作 一、前言 默认情况下,Windows系统上Docker Desktop 安装在 :C:\Program Files\Docker\Docker; 目前正常下载能下载到最新版本是到v4.39.0,实际已经能找到v4.40.0版本来进行修复安装; 建议尽量不要改变Doc…...
【计网】TCP 协议详解 与 常见面试题
三次握手、四次挥手的常见面试题 不用死记,只需要清楚三次握手,四次挥手的流程,回答的时候心里要记住,假设网络是不可靠的 问题(1):为什么关闭连接时需要四次挥手,而建立连接却只要三次握手? 关…...
Docker介绍
Docker介绍 Docker 本身并不是容器,而是一个使用容器的工具。容器是 Linux 内核提供的技术,Docker 只是将这种技术的使用简便化了。Docker 的主要目标是 “Build,Ship and Run Any APP,Anywhere”(“一次封装,到处运行”…...
大模型推理--Qwen2.5-Omni在A100上的初体验
过去的一周Qwen2.5-Omni产生了很高的热度,吸引了很多人的目光。它的多模态确实很吸引人,放出来的demo体验还算尚可(语音对话的延迟还是太大),所以就在A100 PCIe上实地部署了一下,初步对其速度进行了测试&am…...
二分查找例题
本篇基于b站灵茶山艾府。 34. 在排序数组中查找元素的第一个和最后一个位置 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你…...
新增一种线性回归的增量学习框架,已更新31个模型!Matlab回归预测大合集又更新啦!
目录 效果图基本介绍程序设计参考资料 效果图 基本介绍 一种线性回归的增量学习框架,程序研究的主要内容是线性回归模型的增量学习实现及其在房价预测中的应用,旨在通过分块处理数据逐步更新模型,以适应动态数据环境并减少计算资源消耗。 详…...
P1025 [NOIP 2001 提高组] 数的划分(DFS)
题目描述 将整数 n 分成 k 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。 例如:n7,k3,下面三种分法被认为是相同的。 1,1,5; 1,5,1; 5,1,1. 问有多少种不同的分法。 输入格式 n,k …...
SQL Server存储过程和触发器的使用
存储过程 (1)创建存储过程,使用Employees表中的员工人数来初始化一个局部变量,并调用这个存储过程。 1. Create PROCEDURE test number1 int output --输出参数,可以从程序中返回信息 2. As 3. begin 4. D…...
Elastic 的 OpenTelemetry 分发版(EDOT)现已正式发布:开源、可用于生产环境的 OTel
作者:来自 Elastic Miguel Luna 及 Bahubali Shetti Elastic 自豪地宣布正式发布 Elastic OpenTelemetry 分发版(Elastic Distributions of OpenTelemetry - EDOT),其中包含 Elastic 自定义版本的 OpenTelemetry Collector 以及多…...
springMVC-Json交互处理
什么是JSON JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。 采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也…...
MySQL中的索引
explain关键字, MySQL索引特性 索引的概念 MySQL 索引是一种用于提高数据库查询效率的数据结构 数据库表中存储的数据都是以记录为单位的,如果在查询数据时直接一条条遍历表中的数据记录,那么查询的时间复杂度将会是 O ( N )。索引的价值在…...
AI小白:JavaPython开发环境双轨制搭建指南
文章目录 1 Python深度学习环境配置1.1 Anaconda生态体系建设1.2 JupyterLab高效工作流魔法命令与可视化调试扩展插件配置指南 2 Java深度学习方案:DL4J实战2.1 企业级部署架构设计2.2 集成传统Java系统Spring Boot微服务封装模型性能优化技巧 1 Python深度学习环境…...
《比特城的机密邮件:加密、签名与防篡改的守护之战》
点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 第一章:风暴前的密令 比特城的议会大厅内,首席长老艾德文握着一卷足有半人高的羊皮纸,眉头紧锁。纸上是即将颁布的《新纪元法典》——这份文件不仅内…...
Redis之布隆过滤器
面试场景切入 针对于电话号码问题的痛点 布隆过滤器是什么? 由一个初值都为0的bit数组和多个哈希函数构成,用来快速判断集合中是否存在某个元素。 设计思想 本质就是判断具体数据是否存在于一个大的集合中。布隆过滤器是一种类似Set的数据结构&#…...
这是一份简单优雅的Prompt Engineering教程
Prompt Engineering(提示工程)是通过精心设计输入文本(prompt)来引导大型语言模型(LLM)生成更准确、相关且符合预期的输出的技术。其核心在于通过调整提问的措辞、结构、上下文和附加信息,优化模…...
Java基础 4.6
1.成员方法练习 //编写类A:判断一个数是奇数还是偶数,返回boolean //根据行、列、字符打印对应行数和列数的字符,比如:行4 列4 字符# 则打印相应的效果 public class MethodExercise01 {public static void main(String[] args) …...
DApp实战篇:前端技术栈一览
前言 在前面一系列内容中,我们由浅入深地了解了DApp的组成,从本小节开始我将带领大家如何完成一个完整的DApp。 本小节则先从前端开始。 前端技术栈 在前端开发者速入:DApp中的前端要干些什么?文中我说过,即便是在…...
C++中如何比较两个字符串的大小--compare()函数实现
一、现在有一个问题描述:有两个字符串,要按照字典顺序比较它们的大小(注意所有的小写字母都大于所有的大写字母 )。 二、代码 #include <bits/stdc.h> using namespace std;int main() {string str1 "apple";…...
c++中的auto关键字
在 C 中,auto 是一个类型推断关键字(C11 引入),允许编译器根据变量的初始化表达式自动推导其类型。它极大地简化了代码编写,尤其在涉及复杂类型或模板的场景中。以下是 auto 的详细说明: 1. 基本用法 1.1 …...
zk源码—1.数据节点与Watcher机制及权限二
大纲 1.ZooKeeper的数据模型、节点类型与应用 (1)数据模型之树形结构 (2)节点类型与特性(持久 临时 顺序 ) (3)节点的状态结构(各种zxid 各种version) (4)节点的版本(version cversion aversion) (5)使用ZooKeeper实现锁(悲观锁 乐观锁) 2.发布订阅模式࿱…...
交换机和集线器的区别
集线器(Hub)—— 大喇叭广播站 工作原理: 集线器像村里的“大喇叭”,收到任何消息都会广播给所有人。 比如A对B说“你好”,全村人(C、D、E)都能听到,但只有B会回…...
微服务系统记录
记录下曾经工作涉及到微服务的相关知识。 1. 架构设计与服务划分 关键内容 领域驱动设计(DDD): 利用领域模型和限界上下文(Bounded Context)拆分业务,明确服务边界。通过事件风暴(Event Storm…...
同花顺客户端公司财报抓取分析
目标客户端下载地址:https://ft.51ifind.com/index.php?c=index&a=download PC版本 主要难点在登陆,获取token中的 jgbsessid (每次重新登录这个字段都会立即失效,且有效期应该是15天的) 抓取jgbsessid 主要通过安装mitmproxy 使用 mitmdump + 下边的脚本实现监听接口…...
二叉树与红黑树核心知识点及面试重点
二叉树与红黑树核心知识点及面试重点 一、二叉树 (Binary Tree) 1. 基础概念 定义:每个节点最多有两个子节点(左子节点和右子节点) 术语: 根节点:最顶层的节点 叶子节点:没有子节点的节点 深度…...
Rocket-JWT鉴权
目录 一、概述 二、相关依赖 三、环境准备 3.1 创建项目 3.2 读取私钥信息 3.3 token数据负载 3.4 生成token 四、Web鉴权 4.1 验证载体 4.2 接收请求 五、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [Rocket-JWT鉴权] ❤博主广交技术好友,喜…...
2025 年网络安全终极指南
我们生活在一个科技已成为日常生活不可分割的一部分的时代。对数字世界的依赖性日益增强的也带来了更大的网络风险。 网络安全并不是IT专家的专属特权,而是所有用户的共同责任。通过简单的行动,我们可以保护我们的数据、隐私和财务,降低成为…...
横扫SQL面试——PV、UV问题
📊 横扫SQL面试:UV/PV问题 🌟 什么是UV/PV? 在数据领域,UV(Unique Visitor,独立访客) 和 PV(Page View,页面访问量) 是最基础也最重要的指标&…...
ctf-show-杂项签到题
下载文件,解压需要密码,用010打开没看出什么 然后用Advanced Archive Password Recovery暴力破解,发现没用 怀疑是伪解密,解压出来发现加密受损用随波逐流修复加密文件 打开修复的加密文件直接得flag flag:flag{79d…...
对解释器模式的理解
对解释器模式的理解 一、场景1、题目【[来源](https://kamacoder.com/problempage.php?pid1096)】1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 二、不采用解释器模式1、代码2、“缺点” 三、采用解释器模式1、代码2、“优点” 四、思考1、解释器模式的意义…...
高频面试题(含笔试高频算法整理)基本总结回顾64
干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…...
python入门之从安装python及vscode开始
本篇将解决三个问题: 1. 如何下载及安装官方python? 2. 如何下载及安装vscode? 3. 如何配置vscode的python环境? 一、python下载及安装 1.搜索python,找到官网并打开 2.找到download,按需选择版本下载 …...
OpenGL学习笔记(模型材质、光照贴图)
目录 光照与材质光照贴图漫反射贴图采样镜面光贴图 GitHub主页:https://github.com/sdpyy OpenGL学习仓库:https://github.com/sdpyy1/CppLearn/tree/main/OpenGLtree/main/OpenGL):https://github.com/sdpyy1/CppLearn/tree/main/OpenGL 光照与材质 在现实世界里&…...
视觉_transform
visual_transform 图像分块 (Patch Embedding) 假设输入图像为 x ∈ R ∗ H ∗ ∗ W ∗ ∗ C ∗ x∈R^{*H**W**C*} x∈R∗H∗∗W∗∗C∗ C 是图像的通道数(例如,RGB图像的 C3) 将图像分割成N个大小为P*CP的patch,每个patch的大…...
Redis的安装及通用命令
二. Redis 的安装及通用命令 1. Ubuntu 安装 Redis (1) 切换到 root 用户: su root(2) 搜索 Redis 软件包 apt search redis(3) 安装 Redis apt install redis(4) 查看 Redis netstat -anp | grep redis(5) 切换到 Redis 目录下 cd /etc/redis/(6) 修改 Redis 配置文件:…...
Python 实现的运筹优化系统代码详解(0-1规划背包问题)
一、引言 在数学建模与实际决策场景的交织领域中,诸多复杂问题亟待高效且精准的解决方案。0-1 规划作为一种特殊且极为重要的优化方法,宛如一把万能钥匙,能够巧妙开启众多棘手问题的解决之门。它专注于处理决策变量仅能取 0 或 1 这两种极端状…...
护网蓝初面试题
《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...
音视频学习(三十二):VP8和VP9
VP8 简介 全称:Video Processing 8发布者:原 On2 Technologies(2010 被 Google 收购)定位:开源视频压缩标准,主要竞争对手是 H.264应用: WebRTC 视频通信HTML5 <video> 标签(…...
美国mlb与韩国mlb的关系·棒球9号位
MLB(Major League Baseball,美国职业棒球大联盟)作为全球最高水平的职业棒球联赛,与韩国市场流行的“MLB”时尚品牌之间存在着授权合作关系,但两者在业务范畴和品牌定位上存在显著差异。 一、品牌授权背景:…...
免费在线PUA测试工具:识别情感操控,守护情感健康
免费在线PUA测试工具:识别情感操控,守护情感健康 你是否曾经在感情中感到困惑、不安,甚至怀疑自己?今天为大家推荐一个专业的PUA测试工具,帮助你识别是否正在经历情感操控。 测试工具链接:PUA测试工具 什么…...
nginx中的try_files指令
try_files 是 Nginx 中一个非常有用的指令,用于按顺序检查文件是否存在,并返回第一个找到的文件。如果所有指定的文件都不存在,则执行回退逻辑,如重定向到一个指定的 URI 或返回一个错误代码。 作用 文件查找:按顺序检…...
[特殊字符] 驱动开发硬核特训 · Day 4
主题:从硬件总线到驱动控制 —— I2C 协议与传感器驱动开发全解析 I2C(Inter-Integrated Circuit)总线是一种广泛用于嵌入式设备的串行通信协议,因其低成本、简单布线和多从设备支持,成为连接各种传感器(温…...