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

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

测试markdown--肇兴

day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

windows系统MySQL安装文档

概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...