js的Reflect对象
Reflect 对象是 JavaScript ES6 中引入的一个内建对象,它提供了一系列与对象操作相关的方法。这些方法与 Object 对象上的方法类似,但在行为上有一些差异,并且更加规范和统一。Reflect 对象并不是一个构造函数,不能被 new 操作符调用,它是一个静态对象,所有方法都是静态方法。
Reflect 对象的详细方法与示例
-
Reflect.get(target, propertyKey[, receiver])-
作用: 读取对象的属性值。
-
示例:
const obj = {name: 'Alice',age: 25,get greeting() {return `Hello, ${this.name}!`;}, };const protoObj = {city : 'New York' }Object.setPrototypeOf(obj, protoObj);console.log(Reflect.get(obj, 'name')); // 输出: Alice (获取自身属性) console.log(Reflect.get(obj, 'age')); // 输出: 25 console.log(Reflect.get(obj, 'greeting')); // 输出: Hello, Alice! (访问 getter) console.log(Reflect.get(obj, 'city')); // 输出: New York (访问原型属性)const obj2 = {name: 'Bob', }// 使用 receiver 修改 getter 函数的 this 指向 console.log(Reflect.get(obj, 'greeting', obj2)); // 输出: Hello, Bob! -
-
Reflect.set(target, propertyKey, value[, receiver])-
作用: 设置对象的属性值。
-
示例:
const obj = {name: 'Charlie',set age(newAge) {this._age = newAge}, }; const obj2 = {} Object.setPrototypeOf(obj, obj2)console.log(Reflect.set(obj, 'name', 'David')); // 输出: true console.log(obj.name); // 输出: DavidReflect.set(obj, 'age', 30); // 设置 setterconsole.log(obj._age); // 输出: 30Reflect.set(obj, 'age', 35, obj2) // setter 的 this 绑定为 obj2 console.log(obj2._age); // 输出: 35 -
-
Reflect.has(target, propertyKey)- 作用: 检查对象是否包含指定的属性(包括原型链上的)。
- 示例:
const obj = { name: 'Eve', age: 20 }; const protoObj = {city : 'London' } Object.setPrototypeOf(obj, protoObj) console.log(Reflect.has(obj, 'name')); // 输出: true console.log(Reflect.has(obj, 'age')); // 输出: true console.log(Reflect.has(obj, 'city')); // 输出: true console.log(Reflect.has(obj, 'address')); // 输出: false -
Reflect.deleteProperty(target, propertyKey)- 作用: 删除对象的属性。
- 示例:
const obj = { name: 'Frank', age: 40 }; console.log(Reflect.deleteProperty(obj, 'age')); // 输出: true console.log(obj.age); // 输出: undefined console.log(Reflect.deleteProperty(obj, 'city')); // 输出: true (删除不存在的属性也会返回 true) -
Reflect.construct(target, argumentsList[, newTarget])- 作用: 类似于使用
new操作符调用构造函数。 - 示例:
class Person {constructor(name, age) {this.name = name;this.age = age;}greeting() {console.log(`Hello, ${this.name}!`);} }const args = ['Grace', 30]; const person1 = Reflect.construct(Person, args); person1.greeting() // 输出: Hello, Grace! console.log(person1 instanceof Person); // 输出: true// 使用 newTarget 模拟继承 class Student extends Person {} const student = Reflect.construct(Person, args, Student); console.log(student instanceof Student) // 输出 true console.log(student instanceof Person) // 输出 true - 作用: 类似于使用
-
Reflect.getPrototypeOf(target)- 作用: 获取对象的原型。
- 示例:
const obj = { name: 'Henry' }; const protoObj = { city : 'Paris' }; Object.setPrototypeOf(obj, protoObj); console.log(Reflect.getPrototypeOf(obj) === protoObj); // 输出: true console.log(Reflect.getPrototypeOf(obj) === Object.prototype); // 输出 false -
Reflect.setPrototypeOf(target, prototype)- 作用: 设置对象的原型。
- 示例:
const obj = { name: 'Ivy' }; const newProto = { city : 'Rome' };console.log(Reflect.setPrototypeOf(obj, newProto)); // 输出: true console.log(Reflect.getPrototypeOf(obj) === newProto); // 输出: true -
Reflect.apply(target, thisArgument, argumentsList)- 作用: 类似于使用
Function.prototype.apply()调用函数。 - 示例:
function greet(greeting, punctuation) {return `${greeting}, ${this.name}${punctuation}`; }const obj = { name: 'Jack' }; const args = ['Hello', '!']; const result = Reflect.apply(greet, obj, args); console.log(result); // 输出: Hello, Jack! - 作用: 类似于使用
-
Reflect.defineProperty(target, propertyKey, attributes)- 作用: 类似于
Object.defineProperty(),用于定义对象的属性。 - 示例:
const obj = {}; const attributes = {value: 'Katy',writable: true,enumerable: true,configurable: true, };Reflect.defineProperty(obj, 'name', attributes); console.log(obj.name); // 输出: Katy// 尝试修改值 obj.name = 'Lily'; console.log(obj.name); // 输出: Lily - 作用: 类似于
-
Reflect.ownKeys(target)- 作用: 获取对象的所有自身属性的键名,包括 Symbol 类型的键名。
- 示例:
const obj = { name: 'Mike', age: 35, [Symbol('symbolKey')]: 'symbolValue'}; const keys = Reflect.ownKeys(obj); console.log(keys); // 输出: ['name', 'age', Symbol(symbolKey)] -
Reflect.isExtensible(target)- 作用: 判断对象是否可扩展
- 示例:
const obj = {name : "Nancy"} console.log(Reflect.isExtensible(obj)) // 输出 true Reflect.preventExtensions(obj); console.log(Reflect.isExtensible(obj)) // 输出 false -
Reflect.preventExtensions(target)- 作用: 让对象不可扩展
- 示例:
const obj = {name : "Oliver"}console.log(Reflect.preventExtensions(obj)) // 输出 trueobj.age = 30; // 设置属性无效console.log(obj.age); // 输出 undefined
总结:
Reflect 对象提供了一套统一且规范的 API 来操作对象,它的方法通常与 Proxy 对象配合使用,可以实现更加强大和灵活的元编程。
相关文章:
js的Reflect对象
Reflect 对象是 JavaScript ES6 中引入的一个内建对象,它提供了一系列与对象操作相关的方法。这些方法与 Object 对象上的方法类似,但在行为上有一些差异,并且更加规范和统一。Reflect 对象并不是一个构造函数,不能被 new 操作符调…...
this指向了谁?
看函数在执行的时候是如何调用的, 1 如果这个函数是用普通函数调用模式来进行调用,它内部的this指向了window; 2 如果一个函数在调用的时候是通过对象方法模式来进行调用,则它内部的this就是我们的对象; 3 如果一个函数在调用的时候通过构…...
基于Resnet、LSTM、Shufflenet及CNN网络的Daily_and_Sports_Activities数据集仿真
在深度学习领域,不同的网络结构设计用于解决特定的问题。本文将详细分析四种主流网络结构:卷积神经网络(CNN)、残差网络(ResNet)、长短期记忆网络(LSTM)和洗牌网络(Shuff…...
mac系统vsCode中使用Better Comments在.vue文件里失效
问题:关于Better Comments默认在html、TS、JS中有效,在vue中无效,需要单独进行配置 windows系统可以参考友链Better Comments(注释高亮)在vue文件里失效的问题 关于Better Comments电脑的配置路径: Windows系统&…...
UE5.3 C++ Ceiusm中的POI 制作3DUI 结合坐标转化
一.核心思路WidgetComponent CesiumGloberAnchor 二.先制作POI 创建C Actor来制作,APOI。直接上代码 #pragma once#include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "CesiumGlobeAnchorComponent.h" #includ…...
一起学Git【第六节:查看版本差异】
git diff是 Git 版本控制系统中用于展示差异的强大工具。他可以用于查看文件在工作区、暂存区和版本库之间的差异、任意两个指定版本之间的差异和两个分支之间的差异等,接下来进行详细的介绍。 1.显示工作区与暂存区之间的差异 # 显示工作区和暂存区之间的差异,后面不加参数…...
numpy np.newaxis介绍
np.newaxis 是 NumPy 中用于增加数组维度的关键字。它的作用是为数组插入一个新的维度,从而改变数组的形状(shape)。 基本用法 np.newaxis 等价于 None,可以作为索引使用,用于在指定位置增加一个维度。增加的维度的大…...
小程序配置文件 —— 16 项目配置文件和配置 sass
目录 项目配置文件配置 sass 项目配置文件 在创建项目的时候,每个项目的根目录生成两个 config.json 文件(project.config.json 和 project.private.config.json ),用于保存开发者在工具上做的个性化配置,例如和编译有…...
【yolov5】实现FPS游戏人物检测,并定位到矩形框上中部分,实现自瞄
介绍 本人机器学习小白,通过语言大模型百度进行搜索,磕磕绊绊的实现了初步效果,能有一些锁头效果,但识别速度不是非常快,且没有做敌友区分,效果不是非常的理想,但在4399小游戏中爽一下还是可以…...
概率统计与随机过程--作业5
一、推导题 二、计算题 1、某单位为了研究太阳镜销售和广告费用之间的关系,搜集了以下数据,使用回归分析方法得到线性回归模型: 广告费用(万元)x 2 5 6 7 22 25 28 30 22 18 销售量(个…...
“802.11g”,“802.11n”,“802.11ac”,“802.11ax”
802.11g、802.11n、802.11ac、802.11ax都是IEEE制定的无线局域网(WLAN)标准,它们各自具有不同的特点和性能。以下是对这四个标准的详细介绍: 1. 802.11g 定义:802.11g是IEEE制定的一种无线局域网标准,它提…...
Kubernetes 常用的网络插件
上篇内容跟大家简单聊了k8s网络模型原理。分别围绕着容器、Pod、Service、网络策略等展开了详细的讲解。这次想跟大家聊聊k8s的CNI网络插件。 CNI 是 Kubernetes 网络模型的核心组件,它是一个插件接口,允许用户选择和配置网络插件来管理 Pod 的网络。CN…...
Retrofit和rxjava 实现窜行请求,并行请求,循环多次请求,递归请求,错误重试
在使用 Retrofit 和 RxJava 时,可以通过多种方式实现多次请求,比如串行请求、并行请求、依赖请求等。以下是一些常见的实现方式: 1. 串行请求(依赖关系) 一个请求的结果作为另一个请求的输入,可以用 flat…...
2025年度好用便签推荐,电脑桌面便签app分享
在快节奏的现代生活中,高效的时间管理和任务规划变得尤为重要。一款好用的便签软件不仅能帮助我们记录灵感、待办事项,还能极大地提升我们的工作效率。 在众多电脑桌面便签中,好用便签以其出色的桌面便签功能脱颖而出,备受用户青…...
【论文解读】Arbitrary-steps Image Super-resolution via Diffusion Inversion
级别:arXiv Computer Vision and Pattern Recognition(2024)作者:Zongsheng Yue,Kang Liao,Chen Change Loy时间:2024论文链接:Arbitrary-steps Image Super-resolution via Diffusion Inversion摘要 技术概述:该技术基于扩散反转,通过设计部分噪声预测策略来构建扩散…...
kkFileView集成springboot:使用自定义预览接口(非minio预览接口),发现无法预览资源
目录 1、背景2、原因分析3、解决办法 1、背景 按照项目验收要求,需要对minio中存储的数据进行加密 之前提供给kkFileView的预览地址都是获取的minio预览地址 由于minio中的资源进行了加密处理,所以我们自定义预览接口(进行解密操作ÿ…...
被裁20240927 --- 嵌入式硬件开发 STM32篇
人很容易原谅别人的错误但很难原谅别人的正确 1. 文档、手册、指南、资源2. MCU 结构3. MCU 和 MPU 的区别4. 一些概念什么是看门狗 ?什么是 DMA ?什么是晶振 ?什么是片内外设?软件协议、硬件协议、数据协议、通讯协议、通信协议u…...
留学生交流互动系统|Java|SSM|VUE| 前后端分离
【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…...
C/C++ 数据结构与算法【图】 图+邻接矩阵+邻接表+DFS+BFS+最小生成树+最短路径+拓扑排序详细解析【日常学习,考研必备】带图+详细代码
一、图的定义 1)无向图,有向图,完全图 2)稀疏图,稠密图,网,邻接,关联 3)度 4)路径 5)连通图 6)权与网 7)子图 8࿰…...
Linux实验报告7-文件管理
目录 一:实验目的 二:实验内容 (1)查看/etc/inittab文件的权限属性,并指出该文件的所有者以及文件所属组群。 (2)新建文件test,设置文件权限为r--r-----。 (3)新建文件test2,设系统中有用户study和用户组studygr…...
Windows 系统下通过 composer 快速搭建 ThinkPHP6 开发环境及实战配置指南
1. 环境准备:Windows下搭建ThinkPHP6的基础条件 在Windows系统下搭建ThinkPHP6开发环境,首先需要确保基础软件栈的完整性。我遇到过不少新手开发者直接跳过了环境检查环节,结果在后续步骤中频繁报错。这里分享几个必须提前准备好的关键组件&a…...
如何参与Data-Science-For-Beginners社区贡献:完整开源项目参与指南
如何参与Data-Science-For-Beginners社区贡献:完整开源项目参与指南 【免费下载链接】Data-Science-For-Beginners 10 Weeks, 20 Lessons, Data Science for All! 项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners Data-Scienc…...
探索式学习:UMA模型在水分解催化中的应用指南
探索式学习:UMA模型在水分解催化中的应用指南 【免费下载链接】ocp Open Catalyst Projects library of machine learning methods for catalysis 项目地址: https://gitcode.com/GitHub_Trending/oc/ocp 突破传统计算瓶颈:UMA模型的核心价值解析…...
从零到一:彻底搞懂Anaconda,打造完美的Python开发环境
别再为Python环境搞得焦头烂额了,这篇教程带你一次性解决所有烦恼。 作为Python开发者,你是否曾经遇到过这样的场景:项目A需要Python 3.6和旧版本的TensorFlow,而项目B却要求Python 3.12和最新的PyTorch。如果只在系统里装一个Pyt…...
如何自定义ProxyManager代理生成器:从入门到精通的完整指南
如何自定义ProxyManager代理生成器:从入门到精通的完整指南 【免费下载链接】ProxyManager 🎩✨🌈 OOP Proxy wrappers/utilities - generates and manages proxies of your objects 项目地址: https://gitcode.com/gh_mirrors/pr/ProxyMan…...
从轮胎变形到车辆漂移:深入浅出聊聊自动驾驶横向控制里的‘侧偏刚度’
轮胎侧偏刚度:自动驾驶横向控制中的隐形弹簧 想象一下在高速公路上以120km/h的速度变道时,方向盘只需轻轻转动几度——这种看似反直觉的操控背后,是轮胎侧偏刚度在默默发挥着作用。就像跳水运动员入水时水面产生的弹性变形一样,轮…...
在macOS上利用PyInstaller为Windows生成exe文件的3种实用方法
1. 为什么macOS不能直接生成Windows的exe文件? 很多刚开始接触Python打包的开发者都会遇到一个头疼的问题:明明在macOS上写好的脚本,用PyInstaller打包后却不能在Windows电脑上运行。这其实和PyInstaller的工作原理有关——它需要访问目标平…...
Kronos创新应用实战指南:从技术原理到跨行业落地
Kronos创新应用实战指南:从技术原理到跨行业落地 【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos Kronos作为金融市场的"语言模型"&a…...
Qwen2-VL-2B-Instruct模型压缩实战:使用量化工具减小部署体积与加速推理
Qwen2-VL-2B-Instruct模型压缩实战:使用量化工具减小部署体积与加速推理 最近在折腾一个边缘设备上的视觉项目,用上了Qwen2-VL-2B-Instruct这个多模态模型。模型效果确实不错,但原始大小接近8GB,推理速度也慢,在资源有…...
3个超简单步骤:零门槛制作专业级AI视频
3个超简单步骤:零门槛制作专业级AI视频 【免费下载链接】Open-Sora Open-Sora:为所有人实现高效视频制作 项目地址: https://gitcode.com/GitHub_Trending/op/Open-Sora 在数字内容创作领域,AI视频生成技术正以前所未有的速度改变着创…...
