JavaScript系列(74)--反射API详解
JavaScript反射API详解 🔍
JavaScript的反射API提供了强大的运行时检查和操作对象的能力。本文将深入探讨Reflect API的原理、应用场景和最佳实践。
反射基础 🌟
💡 小知识:反射是指程序在运行时能够检查、修改自身结构和行为的能力。JavaScript的Reflect API提供了一组用于控制对象行为的方法,使元编程变得更加简单和规范。
// 基础反射操作
const obj = { name: '张三', age: 25 };// 属性操作
console.log(Reflect.get(obj, 'name')); // 获取属性
Reflect.set(obj, 'age', 26); // 设置属性
console.log(Reflect.has(obj, 'name')); // 检查属性
Reflect.deleteProperty(obj, 'age'); // 删除属性// 对象操作
const newObj = Reflect.construct(Object, []); // 构造对象
const proto = Reflect.getPrototypeOf(obj); // 获取原型
Reflect.setPrototypeOf(newObj, proto); // 设置原型
Reflect API方法详解 📋
1. 属性操作方法
class PropertyOperations {static demonstratePropertyMethods() {const target = { x: 1, y: 2 };const handler = {get: (target, prop) => {console.log(`访问属性: ${prop}`);return Reflect.get(target, prop);}};const proxy = new Proxy(target, handler);// 属性定义Reflect.defineProperty(target, 'z', {value: 3,writable: true,enumerable: true,configurable: true});// 属性描述符获取const desc = Reflect.getOwnPropertyDescriptor(target, 'z');console.log(desc);// 属性枚举console.log(Reflect.ownKeys(target)); // ['x', 'y', 'z']}
}
2. 函数调用与构造
class FunctionOperations {static demonstrateFunctionMethods() {function greet(name) {return `Hello, ${name}!`;}// 函数调用console.log(Reflect.apply(greet, null, ['张三']));// 构造函数调用class Person {constructor(name) {this.name = name;}}const instance = Reflect.construct(Person, ['张三']);console.log(instance.name); // '张三'}
}
3. 原型操作
class PrototypeOperations {static demonstratePrototypeMethods() {class Animal {constructor(name) {this.name = name;}}class Dog extends Animal {bark() {return `${this.name} says woof!`;}}const dog = new Dog('旺财');// 获取原型const proto = Reflect.getPrototypeOf(dog);console.log(proto === Dog.prototype); // true// 设置原型const newProto = {bark() {return `${this.name} says meow!`; // 狗狗变猫咪了}};Reflect.setPrototypeOf(dog, newProto);}
}
实际应用场景 💼
1. 对象代理与验证
class ValidationProxy {static createValidatedObject() {const validator = {set(target, property, value) {if (property === 'age') {if (!Number.isInteger(value)) {throw new TypeError('年龄必须是整数');}if (value < 0 || value > 150) {throw new RangeError('年龄必须在0-150之间');}}return Reflect.set(target, property, value);}};return new Proxy({}, validator);}
}const person = ValidationProxy.createValidatedObject();
person.age = 25; // 正常
// person.age = -1; // 抛出错误
2. 属性监听器
class PropertyObserver {static createObservableObject(target, callback) {return new Proxy(target, {set(target, property, value) {const oldValue = target[property];const result = Reflect.set(target, property, value);if (result && oldValue !== value) {callback(property, oldValue, value);}return result;}});}
}const user = PropertyObserver.createObservableObject({ name: '张三', age: 25 },(property, oldValue, newValue) => {console.log(`${property} changed from ${oldValue} to ${newValue}`);}
);
3. 安全的对象操作
class SafeOperations {static safeGetProperty(obj, prop) {if (Reflect.has(obj, prop)) {return Reflect.get(obj, prop);}return undefined;}static safeSetProperty(obj, prop, value) {try {return Reflect.set(obj, prop, value);} catch (e) {console.error(`Failed to set ${prop}:`, e);return false;}}static safeDeleteProperty(obj, prop) {try {return Reflect.deleteProperty(obj, prop);} catch (e) {console.error(`Failed to delete ${prop}:`, e);return false;}}
}
最佳实践 ⭐
- 使用Reflect API替代直接操作
// 不推荐
obj[prop] = value;
delete obj[prop];// 推荐
Reflect.set(obj, prop, value);
Reflect.deleteProperty(obj, prop);
- 结合Proxy使用
function createLoggingProxy(target) {return new Proxy(target, {get(target, property) {console.log(`Getting ${property}`);return Reflect.get(target, property);},set(target, property, value) {console.log(`Setting ${property} = ${value}`);return Reflect.set(target, property, value);}});
}
- 错误处理
function safeReflection(operation) {try {return operation();} catch (error) {console.error('Reflection operation failed:', error);return null;}
}// 使用示例
safeReflection(() => Reflect.set(obj, 'prop', value));
性能考虑 ⚡
- 缓存反射结果
class ReflectionCache {constructor() {this.cache = new WeakMap();}getPropertyDescriptor(target, property) {let targetCache = this.cache.get(target);if (!targetCache) {targetCache = new Map();this.cache.set(target, targetCache);}if (!targetCache.has(property)) {const descriptor = Reflect.getOwnPropertyDescriptor(target, property);targetCache.set(property, descriptor);}return targetCache.get(property);}
}
- 避免不必要的反射操作
// 不推荐
function getValue(obj, prop) {return Reflect.get(obj, prop); // 对简单属性访问使用反射是多余的
}// 推荐
function getValue(obj, prop) {return obj[prop]; // 直接访问更高效
}// 反射适用于需要额外控制或元编程的场景
function getValueWithValidation(obj, prop) {if (!Reflect.has(obj, prop)) {throw new Error(`Property ${prop} does not exist`);}return Reflect.get(obj, prop);
}
总结 📝
JavaScript的反射API提供了:
- 统一的对象操作接口
- 更安全的对象操作方式
- 强大的元编程能力
- 与Proxy完美配合的API
💡 学习建议:
- 深入理解Reflect API的每个方法
- 掌握反射与代理的结合使用
- 注意性能影响,避免过度使用
- 在适当的场景使用反射
- 始终考虑错误处理
如果你觉得这篇文章有帮助,欢迎点赞收藏,也期待在评论区看到你的想法和建议!👇
终身学习,共同成长。
咱们下一期见
💻
相关文章:
JavaScript系列(74)--反射API详解
JavaScript反射API详解 🔍 JavaScript的反射API提供了强大的运行时检查和操作对象的能力。本文将深入探讨Reflect API的原理、应用场景和最佳实践。 反射基础 🌟 💡 小知识:反射是指程序在运行时能够检查、修改自身结构和行为的…...
轻量级分组加密算法RECTANGLE
轻量级分组加密算法RECTANGLE RECTANGLE轻量级分组密码算法是Wentao Zhang,Zhenzhen Bao,Dongdai Lin等学者于2014年提出的,该算法是SPN结构的,采用了线性移位的置换层以及44bit的S盒。RECTANGLE是一个迭代分组密码,分组长度为64…...
智能设备监控:AI 与 Python 助力设备管理的未来
智能设备监控:AI 与 Python 助力设备管理的未来 引言 随着物联网(IoT)和智能设备的广泛应用,我们的日常生活逐渐离不开这些高科技产品。从智能家居到工业控制,智能设备已经渗透到各个领域。然而,随着设备种类和数量的增加,如何高效地监控这些设备,确保它们的稳定性和…...
python语言进阶之函数
目录 前言 函数的创建和调用 函数创建 调用函数 参数传递 形式参数和实际参数 位置参数 数量必须与定义时一致 位置必须与定义时一致 关键字参数 为参数设置默认值 可变参数 **parameter 返回值 变量的作用域 局部变量 全局变量 匿名函数 前言 提到函数&…...
Golang Model 字段自动化校验设计
背景 在我们日常开发中,不可避免的总要去进行各种参数校验,但是如果在某个场景中,要校验的字段非常多,并且在其中还有耦合关系,那么我们手写校验逻辑就变得非常的低效且难以维护。本篇文档就基于 DDD 领域模型设计的思…...
Hot100 堆
215. 数组中的第K个最大元素 - 力扣(LeetCode) 堆排序 我们可以借助一个小顶堆来维护当前堆内元素的最小值,同时保证堆的大小为 k: 遍历数组将元素入堆; 如果当前堆内元素超过 k 了,我们就把堆顶元素去除…...
AIGC图生视频保姆级教程
一、AI文生图高阶技巧 推荐工具 ▸ MidJourney(艺术感最强) ▸ DALLE 3(与ChatGPT深度联动) ▸ Leonardo.ai(精细化参数控制) 核心策略 提示词架构: [主体描述][环境氛围][镜头语言][风格参数…...
Qt QDateTimeEdit总结
1. 概述 QDateTimeEdit 是 Qt 提供的用于编辑日期和时间的控件,支持直接输入或通过弹出日历/时间选择器调整值。继承自 QAbstractSpinBox,是 QDateEdit 和 QTimeEdit 的父类,可同时处理日期和时间。默认显示格式为系统本地化的日期时间格式&…...
【吾爱出品】 视频批量分段工具
视频批量分段工具 链接:https://pan.xunlei.com/s/VOJDvtHQE7GOiJ84WNea5Ay1A1?pwd5nta# 选择视频文件 启动程序后,点击 "文件" 菜单下的 "选择视频文件" 按钮,或者直接将视频文件拖放到程序窗口中的视频列表区域。支…...
SHEIN的迁移与无奈
日前,因杭州宇树科技、DeepSeek的“六小龙”企业崛起,不少地方开始反思,为什么本地没有留住创始人,或者发展出类似的企业。例如DeepSeek创始人梁文锋和Kimi创始人杨植麟都是广东人,但都在其他地区创业成功。而还有媒体…...
TCP/UDP 简介,三次握手与四次挥手
一、TCP 三次握手 目的:为了解决在不可靠的信道上建立可靠的网络连接 三次握手是连接请求的过程: A 发送连接请求的数据给 B(发送 SYN 包) B 同意连接,返回数据给 A(返回 SYNACK 包) A 收到后回…...
Windows Defender Control--禁用Windows安全中心
Windows Defender Control--禁用Windows安全中心 链接:https://pan.xunlei.com/s/VOJDuy2ZEqswU4sEgf12JthZA1?pwdtre6#...
数据仓库与数据湖的协同工作:智慧数据管理的双引擎
数据仓库与数据湖的协同工作:智慧数据管理的双引擎 引言 在数据驱动的今天,企业和组织收集和存储的数据量正以惊人的速度增长。如何高效管理和利用这些数据,成为了决策者和技术专家的共同难题。为了解决这一问题,数据仓库(Data Warehouse)和数据湖(Data Lake)这两种技…...
50. c++多维数组
在‘19 数组’中描述了原生数组的本质和其索引的原理,一维数组是连续的一个内存块,本质就是指针,指向这个内存块的起始位置,索引的原理就是对该指针的操作。通常对数组的操作一种策略就是使用指针,二维数组可以说是数组…...
用大模型学大模型05-线性回归
deepseek.com:多元线性回归的目标函数,损失函数,梯度下降 标量和矩阵形式的数学推导,pytorch真实能跑的代码案例以及模型,数据,预测结果的可视化展示, 模型应用场景和优缺点,及如何改进解决及改进方法数据推…...
苹果CMS站群插件的自动生成功能:提升网站流量的秘诀
引言 在数字营销的浪潮中,站群技术因其强大的流量引导能力而备受青睐。苹果CMS作为一款优秀的内容管理系统,凭借其灵活性和可扩展性,成为了站群管理的理想选择。本文将详细介绍苹果CMS站群插件的自动生成功能,探讨如何通过这一功…...
大语言模型中one-hot编码和embedding之间的区别?
1. 维度与稀疏性 One-Hot编码 定义:每个词被表示为一个高维稀疏向量,维度等于词汇表大小。例如,词汇表有10,000个词,每个词对应一个10,000维的向量,其中仅有一个位置为1(表示当前词)࿰…...
【Bluedroid】 BLE连接源码分析(一)
BLE链接过程分析见【Bluedroid】BLE连接过程详解-CSDN博客,本篇主要围绕HCI_LE_Create_Connection展开。基于Android14源码进行分析。在蓝牙低功耗技术中,设备之间建立连接是进行数据传输等操作的前提。HCI LE Extended Create Connection Command 提供了一种更灵活、功能更丰…...
【C语言】移除元素
移除元素 给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后…...
SQL与数据库程序设计
1.1986年,10月美国国家标准局颁布了SQL语言的美国标准,称为SQL86 2.SQL(Structured Query Language)又称为结构化查询语言 3.建立索引的主要目的是加快查找的速度 4.在基本表上建立一个或者多个索引 5. 一个基本表是最多只能建立一个聚簇索引 6.CAL…...
基于Java企业项目管理系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
Blazor-设置组件焦点
在Razor中设置焦点我们需要用到ElementReference类型的变量,使用ref指令引用到设置焦点HTML的元素。 在Blazor中,ElementReference类型的作用是提供对HTML DOM元素的引用,以便在C#代码中通过JavaScript互操作(JS Interopÿ…...
信用违约掉期(Credit Default Swap, CDS):金融市场的“保险”还是“定时炸弹”?(中英双语)
信用违约掉期(CDS):金融市场的“保险”还是“定时炸弹”? 引言 信用违约掉期(Credit Default Swap, CDS) 是金融市场中一种重要的衍生品,它最初被设计为债务违约的保险工具,但在实…...
Deepseek R1模型本地化部署与API实战指南:释放企业级AI生产力
摘要 本文深入解析Deepseek R1开源大模型的本地化部署流程与API集成方案,涵盖从硬件选型、Docker环境搭建到模型微调及RESTful接口封装的完整企业级解决方案。通过电商评论分析和智能客服搭建等案例,展示如何将前沿AI技术转化为实际生产力。教程支持Lin…...
核货宝多语言订货系统:打破语言障碍,拓展全球市场
在经济全球化的大背景下,企业的业务版图不断向全球扩张,国际贸易活动日益频繁。对于众多从事跨境贸易、跨国批发零售以及拥有广泛海外客户群体的企业而言,一款能够跨越语言障碍的多语言订货系统,已成为其在全球市场竞争中脱颖而出…...
【prompt示例】智能客服+智能质检业务模版
本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权&am…...
在linux系统中安装Anaconda,并使用conda
系统 : ubuntu20.04 显卡:NVIDIA GTX1650 目录 安装Anaconda第一步:下载合适版本的Anconda1. 查看自己Linux的操作系统及架构命令:uname -a2. 下载合适版本的Anconda 第二步:安装Aanconda1. 为.sh文件设置权限2. 执行.sh文件2.1 .…...
基于 openEuler 构建 LVS-DR 群集
1、环境准备 准备好下面四台台服务器: 主机名IP角色openEuler-1192.168.121.11Director ServeropenEuler-2192.168.121.12Real Server1openEuler-3192.168.121.13Real Server2Rocky8192.168.121.51Client 2、Web服务器配置 在两台RS上安装并配置nginx服务&#…...
委托构造函数与继承构造函数
委托构造函数 允许同一类中的构造函数调用另一个构造函数,以复用初始化逻辑。 委托构造函数不能同时初始化成员变量,只能委托给其他构造函数。 避免循环委托(如构造函数A委托给B,B又委托给A)。 class MyClass { pu…...
EPLAN 自定义图框
一 , 还是先打开系统自带的图框,作为参考 二, 自定义图框 1. 新建图框 2. 绘制。下图描述有误,直接将系统默认图框文件复制,然后重命名,在这个基础上来进行编辑。 三, 使用 1. 更改默认图框 2…...
c++ gcc工具链
GCC(GNU Compiler Collection)是一套广泛使用的开源编译工具链,支持多种编程语言(如 C、C、Objective-C、Fortran 等),主要用于 Linux 和嵌入式开发环境。 组成 GCC 工具链主要由以下几个核心工具组成&am…...
基于51单片机的的鸡笼补光和恒温系统的设计与实现(源程序+Protues仿真+电路图+元件清单+器件手册)
编号:71 基于51单片机的的鸡笼补光和恒温系统的设计与实现 功能描述: 本设计由89C52单片机液晶12864显示模块声光报警电路温湿度传感器电路风扇电路LED照明电路光照检测电路GSM电路DS1302时钟电路 1.实现的功能 (1)采用DHT11温湿传感器、光敏电阻捕捉…...
es-head 正则查询和标准正则查询的差异
在es-head里面查询,需要查询字符串是一个json串,因此就要符合json串的格式,在es-head里面可以通过regexp做正则查询,而这里的正则表达式其实是写成字符串的形式的,因此就要面对字符串转义的问题,比如你想匹…...
【深度学习】深度学习和强化学习算法——深度 Q 网络DQN
深度 Q 网络(Deep Q-Network, DQN) 详解 什么是DQNDQN 的背景DQN 训练流程 2 DQN 的核心思想2.1 经验回放(Experience Replay)2.2 目标网络(Target Network)2.3 ε-贪心策略(ε-Greedy Policy&a…...
matlab模拟风场的随机脉动风
1、内容简介 matlab137-模拟风场的随机脉动风 可以交流、咨询、答疑 2、内容说明 略 模拟风场的随机脉动风,并进行相关的统计分析和计算,包括风速谱、空间相关性、自谱、互谱、以及POD(Proper Orthogonal Decomposition)分解等…...
2025年2月16日(numpy-deepseek)
嗯,用户让我介绍一下这段使用numpy的代码。首先,我需要确认用户的需求是什么。他们可能刚开始学习Python或者数据科学,所以需要基础的解释。让我仔细看一下代码。 第一行是import numpy as np,这应该是导入numpy库,并…...
x64和ARM的区别
x64和ARM是两种不同的处理器架构,它们在指令集、设计理念、应用场景和能耗效率等方面存在显著差异。以下是它们之间的主要区别: 1. **指令集架构**: * **x64**:x64架构,也称为x86-64或AMD64,是x86架…...
电解电容的参数指标
容量 这个值通常是室温25℃,在一定频率和幅度的交流信号下测得的容量。容量会随着温度、直流电压、交流电压值的变化而改变。 额定电压 施加在电容上的最大直流电压,通常要求降额使用。 例如额定电压是4V,降额到70%使用,最高施…...
如何在 Mac 上解决 Qt Creator 安装后应用程序无法找到的问题
在安装Qt时,遇到了一些问题,尤其是在Mac上安装Qt后,发现Qt Creator没有出现在应用程序中。通过一些搜索和操作,最终解决了问题。以下是详细的记录和解决方法。 1. 安装Qt后未显示Qt Creator 安装完成Qt后,启动应用程…...
Spring——Spring开发实战经验(1)
摘要 文章主要介绍了 Swagger 作为 API 文档生成和测试工具的功能,包括自动生成 API 文档、提供可视化调试界面、促进前后端协作、支持 OpenAPI 规范等。同时,还提及了 Spring Boot 与 Swagger3 的实战应用,以及 Spring 开发中其他相关技术内…...
设计模式:代理模式
代理模式是很常见的设计模式,即使没有专门学习过这种设计模式,在工作中也一定用过这种设计模式。在实际生活中,代理模式也是常见的,比如内阁首辅相对于皇帝,前者是后者的代理,内阁首辅收到奏折时࿰…...
【NLP】循环神经网络RNN
目录 一、认识RNN 二、RNN模型分类 三、传统RNN模型 3.1 结构分析 3.2 Pytorch构建RNN模型 3.3 优缺点 一、认识RNN RNN(Recurrent Neural Network),中文称作循环神经网络,一般以序列数据为输入,通过网络内部的结构设计有效捕捉序列之…...
深度解析HTTP/HTTPS协议:从原理到实践
深入浅出HTTP/HTTPS协议:从原理到实践 前言 在当今互联网世界中,HTTP和HTTPS协议如同空气般存在于每个网页请求的背后。作为开发者或技术爱好者,理解这些基础协议至关重要。本文将用六大板块,配合原理示意图和实操案例࿰…...
AF3 MmcifObject类解读
AlphaFold3 中 MmcifObject类 是 解析 mmCIF 文件的核心数据结构,用于存储解析后的蛋白质结构信息,包含PDB 头部信息、Biopython 解析的结构、链序列信息等。 下面代码包含 Monomer 、AtomSite、ResiduePosition、ResidueAtPosition、 MmcifObject以及ParsingResult数据类的…...
大数据SQL调优专题——Hive执行原理
引入 Apache Hive 是基于Hadoop的数据仓库工具,它可以使用SQL来读取、写入和管理存在分布式文件系统中的海量数据。在Hive中,HQL默认转换成MapReduce程序运行到Yarn集群中,大大降低了非Java开发者数据分析的门槛,并且Hive提供命令…...
MySQL常见错误码及解决方法(1130、1461、2003、1040、2000、1049、1062、1129、2002、1690等)
目录 【问题1】、FATAL: error 1130: Unknown error 1130 【问题2】、FATAL: error: 1461 【问题3】、ERROR 2003 (HY000): Cant connect to MySQL server on "" (113) 【问题4】、FATAL: error 2003: Cant connect to MySQL server on 172.19.111.151 (111) 【问…...
类和对象详解(下)-----运算符重载
目录 1.运算符重载 2.赋值运算符重载 3.取地址运算符重载 3.1const成员函数 3.2取地址运算符重载 1.运算符重载 什么是运算符重载呢?简单举个例子就懂了。 就是我想实现日期的加法,而“”这个运算符C只实现了内置类型的加法,而我们要想实…...
Visonpro 检测是否有缺齿
一、效果展示 二、上面是原展开工具CogPolarUnwrapTool; 第二种方法: 用Blob 和 CogCopyRegionTool 三、 用预处理工具 加减常数,让图片变得更亮点 四、圆展开工具 五、模板匹配 六、代码分解 1.创建集合和文子显示工具 CogGraphicCollec…...
(萌新入门)如何从起步阶段开始学习STM32 ——2 我应该学习HAL库还是寄存器库?
概念 笔者下面需要介绍的是库寄存器和HAL库两个重要的概念,在各位看完之后,需要决定自己的学习路线到底是学习HAL呢?还是寄存器呢?还是两者都学习呢? 库寄存器 库寄存器就是简单的封装了我们对寄存器的操作…...
【SQL技术】不同数据库引擎 SQL 优化方案剖析
一、引言 在数据处理和分析的世界里,SQL 是不可或缺的工具。不同的数据库系统,如 MySQL、PostgreSQL(PG)、Doris 和 Hive,在架构和性能特点上存在差异,因此针对它们的 SQL 优化策略也各有不同。这些数据库…...