当前位置: 首页 > 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…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...