关于 Reflect 的笔记
背景:
Reflect为了操作对象而提供的新Api和Proxy对象一样
特点
- 将
object对象的一些明显属于语言内部的方法,放到Reflect上处理; - 修改某些
object返回的异常结果,让其变得更合理; - 让
object操作都变成函数行为; reflect对象上的方法与proxy对象的方法一一对应,只要是proxy上的方法,就能在Reflect对象上找到对应的方法;
console.log('assign' in Object) // object使用命令式行为去操作
console.log(Reflect.has(Object,'assign')) // Object使用函数的行为去操作
方法
-
Reflect.get(target,name,receiver)方法 获取target对象上的name的value值 -
Reflect.set(target,name,value,receiver)方法 设置target对象上的name的value值,并且this修改receiver重新绑定 -
Reflect.has(obj,name)方法 对象上面是否存在某个属性 -
Reflect.deleteProperty(obj,name)方法 删除对象上某个属性
上述方法中第一个参数不是对象的话,会报错
1:使用Reflect.get()方法
语法:Reflect.get(target,name,receiver)
接收三个字段
-
target:目标对象
-
name:属性名
-
receiver: this绑定的对象 接收对象
let myObject = {
foo: 1,
bar: 2,
get baz () {
• return this.foo + this.bar
}
}
console.log(Reflect.get(myObject,'foo')) // 1
console.log(Reflect.get(myObject,'bar')) // 2
console.log(Reflect.get(myObject,'baz')) // 3
1.1 使用receiver来指定数据
let myObject1 = {
foot: 1,
bar: 2,
get boo () {
• return this.foot + this.bar
}
}
let myReceiver = {
foot: 2,
bar: 4,
}
name 在有get的情况下,则读取函数的this绑定receiver (this指向发生了改变)
console.log('访问',myObject1.boo) // 3
console.log('访问2',Reflect.get(myObject1,'boo',myReceiver)) // 6
tips:
Reflect.get()的第一个参数必须是一个对象,否则会报错
2:使用Reflect.set()方法
通过Reflect.set方法设置target的name属性等于value
语法:Reflect.set(target,name,value,receiver)
接收四个字段
-
target:目标对象
-
name:属性名
-
value:值
receiver: this绑定的对象 接收对象
let myObject2 = {
foot: 1,
set bar (value) {
• return this.foot = value
}
}console.log('读取原有属性的值:',myObject2.foot) // 1
Reflect.set(myObject2,'foot', 2)
console.log('Reflect.set修改原有属性的值:',myObject2.foot)// 2
Reflect.set(myObject2,'bar', 6)
console.log('通过Reflect.set修改原有属性的值:',myObject2.foot) // 6
如果name属性设置了赋值函数,则赋值函数的this绑定receiver
let myObject3 = {
foo: 3,
set bar (value) {
• return this.foo = value
}
}
let receiverMyObject = {
foo: 0,
}
通过Reflect.set()修改foo的值
Reflect.set(myObject3,'bar',2,receiverMyObject)
console.log('target原有的值',myObject3.foo) // 3
console.log('this指向的receiver发生了变化:',receiverMyObject.foo) // 2
3:使用Reflect.has()方法
通过 Reflect.has()方法查看属性是否存在,返回boolean值
let obj1 = { a: 1 }
旧方法
console.log('a' in obj1) // true
使用 Reflect.has()方法
语法:Reflect.has(obj,name)
console.log(Reflect.has(obj1,'a')) // true
4:删除属性操作
语法:Reflect.deleteProperty(obj,name)
let obj2 = { title: '标题信息', name: '名称信息' }console.log('对象原有内容:', obj2) // {title: '标题信息', name: '名称信息'}
旧方法
delete obj2.title
console.log('使用旧方法删除的值:', obj2) // {name: '名称信息'}
使用Reflect.deleteProperty()进行删除
Reflect.deleteProperty(obj2,'name')
console.log('使用Reflect.deleteProperty()方法删除后的:', obj2) // { }
笔记,后续持续更新,敬请期待~
相关文章:
关于 Reflect 的笔记
背景:Reflect 为了操作对象而提供的新Api 和 Proxy对象一样 特点 将object 对象的一些明显属于语言内部的方法,放到Reflect 上处理;修改某些object返回的异常结果,让其变得更合理;让object操作都变成函数行为…...
week04day02(爬虫02)
<span>: 通常用于对文本的一部分进行样式设置或脚本操作。<a>: 定义超链接,用于创建链接到其他页面或资源的文本。<img>: 用于插入图像。<br>: 用于插入换行。 姓名:<input type"text" value"lisi">…...
【C++初阶】类和对象(中)
目录 一.类的6个默认成员函数 1.知识引入 编辑 2.构造函数 (1)概念 (2)语法特性 (3)特征 ①问题引入1 ②问题引入2 (缺少默认构造函数) 3.析构函数 (1)概念 (2)特性 4.拷贝构造函数 (1)概念 (2)特征 ①拷贝构造函数是构造函数的一…...
Python爬虫知识图谱
下面是一份详细的Python爬虫知识图谱,涵盖了从基础入门到进阶实战的各个环节,涉及网络请求、页面解析、数据提取、存储优化、反爬策略应对以及法律伦理等多个方面,并配以关键点解析和代码案例,以供读者深入学习和实践。 一、Pyth…...
安宝特AR汽车行业解决方案系列1-远程培训
在汽车行业中,AR技术的应用正悄然改变着整个产业链的运作方式,应用涵盖培训、汽修、汽车售后、PDI交付、质检以及汽车装配等,AR技术为多个环节都带来了前所未有的便利与效率提升。 安宝特AR将以系列推文的形式为读者逐一介绍在汽车行业中安宝…...
微服务篇之分布式系统理论
一、CAP定理 1.什么是CAP 1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标: 1. Consistency(一致性)。 2. Availability(可用性)。 3. Partition tolerance ࿰…...
MLflow【部署 01】MLflow官网Quick Start实操(一篇学会部署使用MLflow)
一篇学会部署使用MLflow 1.版本及环境2.官方步骤Step-1 Get MLflowStep-2 Start a Tracking ServerStep 3 - Train a model and prepare metadata for loggingStep 4 - Log the model and its metadata to MLflowStep 5 - Load the model as a Python Function (pyfunc) and us…...
NDK的log.h使用__android_log_print报错app:buildCMakeDebug[x86_64]
org.gradle.api.tasks.TaskExecutionException: Execution failed for task :app:buildCMakeDebug[x86_64] 重点是 Execution failed for task :app:buildCMakeDebug[x86_64]. 我的代码: #include <android/log.h> #define LOG_TAG "MyJNI" #d…...
【计算机网络:DHCP协议】
文章目录 前言一、DHCP是什么?二、DHCP的工作原理1.基本流程发现(DISCOVER)提供(OFFER)请求(REQUEST)确认(ACKNOWLEDGEMENT) 2.DHCP租约的概念3.DHCP续租过程 三、DHCP服…...
http前生今世
HTTP/0.9,仅支持GET方法,并且响应中没有HTTP头信息,只有文档内容。 HTTP/1.0增加了对POST方法、状态码、HTTP头信息等的支持,这一版本也是广泛应用的历史性版本。 HTTP/1.1引入了持久连接(Persistent Connections&…...
一键安装ROS适用于Ubuntu22/20/18
一键安装ROS适用于Ubuntu22/20/18 1、简介 ROS(Robot Operating System,机器人操作系统)是一个用于机器人软件开发的框架。它提供了一套工具和库,用于机器人应用程序的开发、测试和部署。ROS是由美国斯坦福大学机器人实验室&…...
OLED透明屏厂家:开启2024年新征程
随着科技的不断进步和创新,OLED透明屏作为一种前沿的显示技术,正逐渐走进人们的视野,成为多个领域的焦点。在2024年2月21日这个特殊的日子,我们这家领先的OLED透明屏厂家正式开工,预示着我们将迎来一个充满机遇和挑战的…...
【算法与数据结构】200、695、LeetCode岛屿数量(深搜+广搜) 岛屿的最大面积
文章目录 一、200、岛屿数量1.1 深度优先搜索DFS1.2 广度优先搜索BFS 二、695、岛屿的最大面积2.1 深度优先搜索DFS2.2 广度优先搜索BFS 三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、200、岛屿数量 1.1 深度优先搜…...
第四十一回 还道村受三卷天书 宋公明遇九天玄女-python创建临时文件和文件夹
宋江想回家请老父亲上山,晁盖说过几天带领山寨人马一起去。宋江还是坚持一个人去。 宋江到了宋家村,被两个都头和捕快们追捕,慌不择路,躲进了一所古庙。一会儿,听见有人说:小童奉娘娘法旨,请星主…...
Tofu5m 高速实时推理Yolov8
Tofu5m 是高性价比目标识别跟踪模块,支持可见光视频或红外网络视频的输入,支持视频下的多类型物体检测、识别、跟踪等功能。 Yolov8推理速度达到40帧每秒。 实测视频链接:Tofu5m识别跟踪模块_哔哩哔哩_bilibili 产品支持视频编码、设备管理…...
[SWPUCTF 2021 新生赛]crypto8
第一眼看见是乱码不确定是什么的编码 看了下感觉是UUencode编码 UUencode编码是一种古老的编码方式,通常用于将二进制数据转换成可打印字符的形式。UUencode编码采用一种基于64个字符的编码表,将每3个字节的数据编码为4个可打印字符,以实现…...
学习使用js调用动态函数名(动态变量函数名)
学习使用js调用动态函数名-动态变量函数名 背景代码 背景 函数名写在 html 上,在 js 中定义这个变量,js 报错该函数不存在,在此给出解决方法 代码 //html代码如下 <a data-function"qipa" class"clickMe">250&l…...
CSS 圆形的时钟秒针状的手柄绕中心点旋转的效果
<template><!-- 创建一个装载自定义加载动画的容器 --><view class="cloader"><!-- 定义加载动画主体部分 --><view class="clface"><!-- 定义类似秒针形状的小圆盘 --><view class="clsface"><!-…...
MYSQL--存储过程操作
一:概念: 存储过程实际上对标了JAVA当中的方法,两者是相似的,同时需要注意的一点是,MYSQL仅仅在5.0版本之后才出现这种存储操作的过程; 优点: 1.存储过程能够让运行的速度变得更加迅速ÿ…...
C#上位机与三菱PLC的通信09---开发自己的通讯库(A-3E版)
1、A-3E报文回顾 具体细节请看: C#上位机与三菱PLC的通信05--MC协议之QnA-3E报文解析 C#上位机与三菱PLC的通信06--MC协议之QnA-3E报文测试 2、为何要开发自己的通讯库 前面开发了自己的A-1E协议的通讯库,实现了数据的读写,对于封装的通…...
【头歌Educoder】国防科大 模板与 STL
第1关:初识模板函数任务目的本关目的:编写你的第一个模板函数。编程要求本题的要求为:编写模板函数 template <typename T, int n> int getIndex (T a[], T x)返回长度为 n 的数组 a 中 x 第一个出现的位置(下标)…...
Vivado用户必看:中文用户名导致Vscode关联失效?手把手教你修改vivado.xml文件
Vivado与Vscode联动的终极解决方案:彻底攻克中文路径兼容性问题 在FPGA开发领域,Vivado作为Xilinx推出的旗舰级开发工具,与轻量级代码编辑器Vscode的联动已经成为提升开发效率的标准配置。然而,许多中文用户在实际操作中常常遇到…...
Zynq UltraScale+ MPSoC SoM选型与开发实战:从异构计算到嵌入式系统设计
1. 项目概述:为什么选择Zynq UltraScale MPSoC SoM? 在嵌入式系统开发,尤其是需要高性能计算、实时处理与灵活硬件加速的领域,选型往往是决定项目成败的第一步。过去几年,我经手过不少项目,从简单的微控制器…...
基于STM32H750XBH6开发板的LwIP socket编程初探
这里写目录标题 1、RAW、NETCONN和socket编程特点 2、基于socket的UDP编程 3、基于socket的TCP编程 3.1、TCP客户端编程 3.2、TCP客户端编程 4、问题记录 1、RAW、NETCONN和socket编程特点 LwIP下三种编程方式分别是RAW API、NETCONN API和Socket API,这三种方式均可以实现常用…...
DeepSeek+GCP生产就绪 checklist(含IAM最小权限矩阵、VPC Service Controls白名单、审计日志留存合规项)——限时开放下载
更多请点击: https://kaifayun.com 第一章:DeepSeekGCP生产就绪部署全景概览 DeepSeek大模型在Google Cloud Platform(GCP)上的生产就绪部署,需兼顾模型服务化、弹性扩缩容、可观测性、安全合规与成本优化五大核心维度…...
告别黑窗口:在Ubuntu上用VSCode调试你的第一个OpenGL三角形程序
告别黑窗口:在Ubuntu上用VSCode调试你的第一个OpenGL三角形程序 对于习惯现代IDE的开发者来说,在终端里反复敲入gcc -lGL -lglut编译命令就像用石器时代的工具雕刻钻石。本文将带你用VSCode重构OpenGL开发体验,从零搭建一个可调试的图形编程…...
定义查询≠复制粘贴:Perplexity定义功能的稀缺性使用手册(仅限前500名深度用户验证的6条黄金规则)
更多请点击: https://intelliparadigm.com 第一章:定义查询≠复制粘贴:Perplexity定义功能的本质再认知 Perplexity 的“定义查询”(Define Query)并非对搜索引擎结果的简单抓取与拼接,而是一种基于语义理…...
第11代酷睿工业主板PICO-TGU4:边缘AI与机器视觉的紧凑型解决方案
1. 项目概述:当紧凑型工业主板遇上第11代酷睿在工业自动化、边缘计算和智能零售这些领域里,我们常常面临一个经典的矛盾:一方面,应用场景对计算性能的要求越来越高,无论是机器视觉的实时图像处理,还是AI推理…...
Linux串口编程进阶:深入termios2结构体,搞定CH340/FTDI各种转接器的非标准波特率
Linux串口编程实战:破解CH340/FTDI非标准波特率适配难题 当你在工业物联网项目中尝试将某个9600bps的设备升级到115200bps时,可能会发现某些USB转串口适配器死活不配合——明明代码正确,波特率却始终无法生效。这不是你的错,而是…...
3步解锁开源字体编辑器:从零基础到专业字体设计师的蜕变之路
3步解锁开源字体编辑器:从零基础到专业字体设计师的蜕变之路 【免费下载链接】fontforge Free (libre) font editor for Windows, Mac OS X and GNULinux 项目地址: https://gitcode.com/gh_mirrors/fo/fontforge FontForge是一款跨平台的开源字体编辑器&…...
