ES6 Reflect 详解(三)

Reflect 对象与Proxy 对象一样,也是 ES6 为了操作对象而提供的新 API。 Reflect 对象的设计目的有 4 个。

  1. 将 Object 对象的一些明显属于语言内部的方法(比如 Object.defineProperty ),放到 Reflect 对象上。现阶段,某些方法同时在 Object 和 Reflect 对象上部署,未来的新方法将只部署在 Reflect 对象上。也就是说,从 Reflect 对象上可以拿到语言内部的方法。
  2. 修改某些 Object 方法的返回结果,让其变得更合理。比如, Object.defineProperty(obj, name, desc) 在无法定义属性时,会抛出一个错误,而 Reflect.defineProperty(obj, name, desc) 则会返回 false 。
// 老写法
try {Object.defineProperty(target, property, attributes);// success
} catch (e) {// failure
}
// 新写法
if (Reflect.defineProperty(target, property, attributes)) {// success
} else {// failure
}
  1. 让 Object 操作都变成函数行为。某些 Object 操作是命令式,比如 name in obj 和 delete obj[name] ,而 Reflect.has(obj, name) 和 Reflect.deleteProperty(obj, name) 让它们变成了函数行为。
// 老写法
'assign' in Object // true
// 新写法
Reflect.has(Object, 'assign') // true
  1. Reflect对象的方法与 Proxy对象的方法一一对应,只要是 Proxy 对象的方法,就能在 Reflect 对象上找到对应的方法。这就让 Proxy 对象可以方便地调用对应的 Reflect 方法,完成默认行为,作为修改行为的基础。也就是说,不管 Proxy 怎么修改默认行为,你总可以在 Reflect 上获取默认行为。
Proxy(target, {set: function(target, name, value, receiver) {var success = Reflect.set(target, name, value, receiver);if (success) {console.log('property ' + name + ' on ' + target + ' set to ' + value);}return success;}
});

Proxy 方法拦截 target 对象的属性赋值行为。它采用 Reflect.set 方法将值赋值给对象的属性,确保完成原有的行为,然后再部署额外的功能。

常用方法:

Reflect.get(target, propertyKey[, receiver]):获取对象的属性。
Reflect.set(target, propertyKey, value[, receiver]):设置对象的属性。
Reflect.has(target, propertyKey):判断属性是否存在于对象上。
Reflect.deleteProperty(target, propertyKey):删除对象的属性。
Reflect.ownKeys(target):返回对象自身的所有属性的数组。
Reflect.getOwnPropertyDescriptor(target, propertyKey):获取对象属性的描述符。
Reflect.defineProperty(target, propertyKey, attributes):定义或修改对象的属性。
Reflect.preventExtensions(target):阻止对象被扩展。
Reflect.isExtensible(target):判断对象是否可扩展。
Reflect.getExtension(target):获取对象的原型。
Reflect.setPrototypeOf(target, prototype):设置对象的原型。

示例1:使用 Reflect.get

let obj = { name: "Alice", age: 25 };
let propName = "name";console.log(Reflect.get(obj, propName)); // 输出:Alice
console.log(Reflect.get(obj, "gender")); // 输出:undefined

示例2:使用 Reflect.set

let obj = { name: "Alice" };// 设置属性
console.log(Reflect.set(obj, "age", 30)); // 输出:trueconsole.log(obj); // 输出:{ name: "Alice", age: 30 }

示例3:使用 Reflect.has

let obj = { name: "Alice" };console.log(Reflect.has(obj, "name")); // 输出:true
console.log(Reflect.has(obj, "age"));  // 输出:false

示例4:使用 Reflect.deleteProperty

let obj = { name: "Alice", age: 30 };// 删除属性
console.log(Reflect.deleteProperty(obj, "age")); // 输出:trueconsole.log(obj); // 输出:{ name: "Alice" }

示例5:使用 Reflect.ownKeys

let obj = { name: "Alice", age: 30 };console.log(Reflect.ownKeys(obj)); // 输出:["name", "age"]

示例6:使用 Reflect.preventExtensions

let obj = { name: "Alice" };// 防止对象被扩展
console.log(Reflect.preventExtensions(obj)); // 输出:true// 尝试添加新属性
console.log(Reflect.set(obj, "age", 30)); // 输出:false

示例7:使用 Reflect.isExtensible

let obj = { name: "Alice" };console.log(Reflect.isExtensible(obj)); // 输出:true

示例8:使用 Reflect.getPrototypeOf 和 Reflect.setPrototypeOf

let proto = { sayHello: function() { console.log("Hello!"); }};
let obj = Object.create(proto);console.log(Reflect.getPrototypeOf(obj) === proto); // 输出:true// 设置新原型
let newProto = { sayGoodbye: function() { console.log("Goodbye!"); }};
Reflect.setPrototypeOf(obj, newProto);console.log(obj.sayGoodbye); // 可以访问新原型上的方法
obj.sayGoodbye(); // 输出:Goodbye!

Reflect 对象提供了一种与 Proxy 陷阱相对应的方法集合,使得拦截 JavaScript 操作更加直观和方便。使用 Reflect可以确保操作的一致性和预期的行为,特别是在需要明确捕获失败情况或错误时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/43400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机数据恢复篇:优秀的 iPhone 数据恢复汇总

如果您不幸遭遇 iPhone 死机、进水或死机,一切还不算晚。您可以使用 iPhone 数据恢复应用恢复文件、照片、应用数据、消息等。 使用以下选项,您可以恢复 iPhone 上的少量内容、特定项目或所有内容。有些应用程序甚至提供修复工具来修复最初导致数据丢失…

这组杭州亚运会可视化大屏,绝对引领了时代。

本期分享杭州亚运会的可视化大屏,非常的震撼,杭州不愧为我国互联网最发达的的城市之一。 怒赞!!!

暑期旅游怎么玩?开发旅游小程序让出行变简单

暑假正值旅游旺季,旅游小程序的出现为旅行带来了许多便利。随着移动互联网的发展,旅游行业也在不断寻求创新与变革。旅游小程序为游客提供了更加便捷的旅行体验,通过旅游小程序,用户可以了解旅游信息、旅游服务、在线咨询等&#…

从 Github 安装 R packages 不完全指南

前言 R语言,一个被广泛使用的统计计算和数据分析工具。在日常使用过程中,需要安装实现各种功能、来自各种渠道的工具包(packages)比如:CRNA或者Github。很多包已经发布在 CRAN 上,使用 install.packages(&q…

【Dison夏令营 Day 13】使用 Python 创建扫雷游戏

在本文中,我们将介绍如何使用 Python 语言创建自己的基于终端的扫雷程序。 关于游戏 1992年4月6日,扫雷和纸牌、空当接龙等小游戏搭载在Windows 3.1系统中与用户见面,主要目的是让用户训练使用鼠标。扫雷是一款单人游戏,这个游戏…

Linux系统下anaconda的安装与Pytorch环境的下载

首先,在命令行通过cd命令,进入用户文件夹 cd xxx/xxx/username进入anaconda官网https://repo.anaconda.com/archive/,寻找anaconda下载包资源,这里选择最新的anaconda下载包 Anaconda3-2024.06-1-Linux-x86_64.sh 在命令行执行安…

Python爬虫-获取懂车帝“指定车型”的销量数据

前言 本文是该专栏的第33篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者有详细介绍关于懂车平台的相关爬虫,如下所示: 1. Python爬虫-新能源汽车对应的“年份月份”销量榜 2. Python爬虫-懂车帝城市销量榜单 3. Python爬虫-新能源汽车销量榜 4. Pyth…

:-1: error: ninja: build stopped: subcommand failed.

错误解释: 这个错误通常出现在使用Ninja构建系统进行软件编译时。Ninja是一个小型的构建系统,它比make更快,因为它直接调用指定的命令来执行构建,而不是像make那样通过一套复杂的规则和依赖关系来进行。如果在Ninja构建过程中遇到…

气膜建筑如何在文化旅游行业中应用—轻空间

一、气膜建筑简介 气膜建筑是一种新型建筑形式,其主要结构由高强度膜材、空气支撑系统和固定系统组成。通过不断向膜体内部充气,使其形成稳定的内部压力来支撑整个建筑结构。气膜建筑因其建设速度快、成本相对较低、环保节能等优点,近年来在各…

阶段三:项目开发---大数据开发运行环境搭建:任务3:安装配置Hadoop集群

任务描述 知识点:安装配置Hadoop 重 点: 安装配置Hadoop 难 点:无 内 容: Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威…

Linux系统编程——线程控制

目录 一,关于线程控制 二,线程创建 2.1 pthread_create函数 2.2 ps命令查看线程信息 三,线程等待 3.1 pthread_join函数 3.2 创建多个线程 3.3 pthread_join第二个参数 四,线程终止 4.1 关于线程终止 4.2 pthread_exit…

【软件设计师】九、数据流图、UML图

知识点1:数据流图 数据路流图亦称为数据流程图,一种便于用户理解,分析系统数据流称的图形工具;买哦书系统的功能,输入,输出,数据存储等; 知识点2:数据字典 数据流&…

深度学习 - 模型剪枝技术详解

模型剪枝简介 模型剪枝(Model Pruning)是一种通过减少模型参数来降低模型复杂性的方法,从而加快推理速度并减少内存消耗,同时尽量不显著降低模型性能。这种技术特别适用于资源受限的设备,如移动设备和嵌入式系统。模型…

提示词工程课程,白嫖A100活动课程

扫下面二维码即可参加 免费使用A100,学习大模型相关知识! 前置知识: 内容来源:Docs 模型设置 在使用提示词的时候,您会通过 API 或者网页版与大语言模型进行交互,将这些参数、设置调整到最佳程度会提高使…

面试题 12. 矩阵中的路径

矩阵中的路径 题目描述示例 题解 题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成&#xff0…

14-47 剑和诗人21 - 2024年如何打造AI创业公司

​​​​​ 2024 年,随着人工智能继续快速发展并融入几乎所有行业,创建一家人工智能初创公司将带来巨大的机遇。然而,在吸引资金、招聘人才、开发专有技术以及将产品推向市场方面,人工智能初创公司也面临着相当大的挑战。 让我来…

UML中用例和用例图的概念

用例 用例模型的基本组成部分有用例、参与者(或角色)和系统。用例用于描述系统的功能,也就是从用户的角度来说,系统具体应包含哪些功能,从而帮助分析人员理解系统的行为。它是对系统功能的宏观的、整体的描述。一个完…

idea中的块映射中的子元素无效

在yml文件中,出现块映射中的子元素无效,如图: 在YAML文件中,通常需要在键和值之间添加空格,以确保文件的可读性和正确解析。一些YAML解析器可能要求在冒号后面必须有空格才能正确解析文件。如果不加空格,解…

TEE开发Secure driver介绍-TEE安全驱动/trustzone

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】TEE从入门到精通-[目录] 👈👈👈思考: 如何开发一个TA? sdk又是什么?开发一个TA的流程是怎样的?How to do?有关TA的签名介绍TEE开发Secure driver介绍RP…

RedHat运维-Linux存储管理基础3-创建并扩展逻辑卷

逻辑卷的核心:____________________________________________; 逻辑卷的核心:____________________________________________; 逻辑卷的核心:____________________________________________; 1. 已知/dev/s…