当前位置: 首页 > news >正文

js的Reflect对象

Reflect 对象是 JavaScript ES6 中引入的一个内建对象,它提供了一系列与对象操作相关的方法。这些方法与 Object 对象上的方法类似,但在行为上有一些差异,并且更加规范和统一。Reflect 对象并不是一个构造函数,不能被 new 操作符调用,它是一个静态对象,所有方法都是静态方法。

Reflect 对象的详细方法与示例

  1. 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!
    
  2. 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
    
  3. 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
    
  4. 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)
    
  5. 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
    
  6. 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
    
  7. 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
    
  8. 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!
    
  9. 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
    
  10. 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)]
    
  11. Reflect.isExtensible(target)

    • 作用: 判断对象是否可扩展
    • 示例:
    const obj = {name : "Nancy"}
    console.log(Reflect.isExtensible(obj)) // 输出 true
    Reflect.preventExtensions(obj);
    console.log(Reflect.isExtensible(obj)) // 输出 false
    
  12. 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 销售量(个&#xf…...

“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中的资源进行了加密处理,所以我们自定义预览接口(进行解密操作&#xff…...

被裁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&#xff0…...

Linux实验报告7-文件管理

目录 一:实验目的 二:实验内容 (1)查看/etc/inittab文件的权限属性,并指出该文件的所有者以及文件所属组群。 (2)新建文件test,设置文件权限为r--r-----。 (3)新建文件test2,设系统中有用户study和用户组studygr…...

Android学习之定时任务

Android定时任务的实现方式 在Android开发中,定时任务主要可以通过以下两类方式实现: Android系统组件 Handler消息机制:通过Handler.postDelayed()实现延时任务,适合简单UI线程操作AlarmManager:系统级定时服务&…...

硬件学习笔记--64 MCU的ARM核架构发展及特点

MCU(微控制器)的ARM核架构是当前嵌入式系统的主流选择,其基于ARM Cortex-M系列处理器内核,具有高性能、低功耗、丰富外设支持等特点。以下是ARM核MCU的主要架构及其发展: 1. ARM Cortex-M系列内核概览 ARM Cortex-M系…...

【Python-Day 20】揭秘Python变量作用域:LEGB规则与global/nonlocal关键字详解

Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

Ubuntu 22.04 上使用 Docker 安装 RagFlow

GitHub地址:添加链接描述 RAGFlow 是一款开源的检索增强生成(Retrieval-Augmented Generation,简称 RAG)引擎,旨在通过深度文档理解技术,结合大语言模型(LLM),为用户提供高质量、可溯源的问答服务。 🚀 快速入门 RAGFlow 提供了便捷的部署方式,支持 Docker 环境。…...

【OpenSearch】高性能 OpenSearch 数据导入

高性能 OpenSearch 数据导入 1.导入依赖库2.配置参数3.OpenSearch 客户端初始化4.创建索引函数5.数据生成器6.批量处理函数7.主导入函数7.1 函数定义和索引创建7.2 优化索引设置(导入前)7.3 初始化变量和打印开始信息7.4 线程池设置7.5 主数据生成和导入…...

KVM——CPU独占

文章目录 机器现况信息配置CPU独占(pin)启用 CPU 独占(隔离)验证 机器现况信息 [rootkvm-server ~]# virsh list --allId 名称 状态 --------------------------- CULinux-VM 关闭- ubuntu20.04 关闭- ubuntu24.04 关闭[roo…...

vscode实时预览编辑markdown

vscode实时预览编辑markdown 点击vsode界面,实现快捷键如下: 按下快捷键 CtrlShiftV(Windows/Linux)或 CommandShiftV(Mac)即可在侧边栏打开 Markdown 预览。 效果如下:...

华为OD机试真题——求最多可以派出多少支队伍(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...

Go语言中flag包的用法详解

在Go语言编程中,flag包是标准库中用于解析命令行参数的强大工具。它提供了一种简单且灵活的方式来定义和处理命令行标志(flag),使得程序能够从命令行接收用户输入的参数。本文将详细介绍flag包的用法,包括基本概念、常…...

Python爬虫第22节- 结合Selenium识别滑动验证码实战

目录 一、引言 二、滑动验证码原理与反爬机制 2.1 验证码原理 2.2 反爬机制 三、工程实战:滑动验证码识别全流程 3.1 工程准备 3.1.1 环境依赖 3.1.2 目标网站与验证码识别案例 3.2 核心破解流程 3.2.1 自动化打开网页与登录 3.2.2 获取验证码图片&#…...