JavaScript 反射学习技巧


Posted in Javascript onOctober 16, 2021

1、前言

根据 MDN 官网解释: Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与 proxy handlers (en-US) 的方法相同。 Reflect 不是一个函数对象,因此它是不可构造的。

那么它到底是什么?根据上面文件介绍会发现它和 Proxy 极像,都是获取执行函数本身信息。主要是区别在于所有的函数对象属性过于复杂,而且额外增加可能会导致程序行为不合理,所以扩展 Reflect 函数来专门对函数对象处理调用方法,构造对象,获取或者设置属性等相关操作。

2、接口

Reflect 里面所有的方法都是静态方法,不需要构造函数或者实例化它。

  • Reflect.apply(target, thisArgument, argumentsList)、对一个函数进行调用操作,同时可以传入一个数组作为调用参数。和 Function.prototype.apply() 功能类似。
  • Reflect.construct(target, argumentsList[, newTarget\] )对构造函数进行 new 操作,相当于执行 new target(...args) 。
  • Reflect.defineProperty(target, propertyKey, attributes)和 Object.defineProperty() 类似。如果设置成功就会返回 true
  • Reflect.deleteProperty(target, propertyKey)作为函数的 delete 操作符,相当于执行 delete target[name]  。
  • Reflect.get(target, propertyKey[, receiver\])获取对象身上某个属性的值,类似于 target[name]
  • Reflect.getOwnPropertyDescriptor(target, propertyKey)类似于 Object.getOwnPropertyDescriptor() 。如果对象中存在该属性,则返回对应的属性描述符, 否则返回 undefined .
  • Reflect.getPrototypeOf(target)类似于 Object.getPrototypeOf()
  • Reflect.has(target, propertyKey)判断一个对象是否存在某个属性,和 in 运算符 的功能完全相同。
  • Reflect.isExtensible(target)类似于 Object.isExtensible() .
  • Reflect.ownKeys(target)返回一个包含所有自身属性(不包含继承属性)的数组。(类似于 Object.keys() , 但不会受 enumerable影响 ).
  • Reflect.preventExtensions(target)类似于 Object.preventExtensions() 。返回一个 Boolean
  • Reflect.set(target, propertyKey, value[, receiver\])将值分配给属性的函数。返回一个 Boolean ,如果更新成功,则返回 true
  • Reflect.setPrototypeOf(target, prototype)设置对象原型的函数. 返回一个 Boolean , 如果更新成功,则返回 true

3、简单的例子

比如现在有个函数:

class Person {
  constructor(firstName, lastName) {
    this.firstName = firstName
    this.lastName = lastName
  }
  get getName() {
    return this.firstName + ' ' + this.lastName
  }
}

正常使用只需要进行实例化即可:

const person = new Person('Jaxson', 'Wang')
console.log(person.getName) // Jaxson Wang

可以使用 Reflect.construct() 方法来创建对象:

const person = Reflect.construct(Person, ['Jaxson', 'Wang'])
console.log(person) // Jaxson Wang

4、结语

Reflect 对象经常和 Proxy 代理一起使用,原因有三点:

  • Reflect 提供的所有静态方法和 Proxy 第2个 handle 参数方法是一模一样的。
  • Proxy get/set() 方法需要的返回值正是 Reflectget/set 方法的返回值,可以天然配合使用,比直接对象赋值/获取值要更方便和准确。
  • receiver 参数具有不可替代性。

到此这篇关于JavaScript 反射学习技巧的文章就介绍到这了,更多相关JavaScript 反射内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Js 中debug方式
Feb 07 Javascript
javascript 学习笔记(onchange等)
Nov 14 Javascript
用jquery生成二级菜单的实例代码
Jun 24 Javascript
javascript版的in_array函数(判断数组中是否存在特定值)
May 09 Javascript
详解JavaScript基本类型和引用类型
Dec 09 Javascript
基于easyui checkbox 的一些操作处理方法
Jul 10 Javascript
带你快速理解javascript中的事件模型
Aug 14 Javascript
vue基于mint-ui的城市选择3级联动的示例
Oct 25 Javascript
VSCode 配置React Native开发环境的方法
Dec 27 Javascript
基于vue-router 多级路由redirect 重定向的问题
Sep 03 Javascript
TypeScript基础入门教程之三重斜线指令详解
Oct 22 Javascript
js实现简单贪吃蛇游戏
May 15 Javascript
JS的深浅复制详细
Oct 16 #Javascript
JS 基本概念详细介绍
Oct 16 #Javascript
AJAX实现指定部分页面刷新效果
AJAX实现省市县三级联动效果
Oct 16 #Javascript
简单聊聊Vue中的计算属性和属性侦听
Oct 05 #Vue.js
JS中如何优雅的使用async await详解
Oct 05 #Javascript
js中Object.create实例用法详解
Oct 05 #Javascript
You might like
星际争霸任务指南——人族
2020/03/04 星际争霸
通过对php一些服务器端特性的配置加强php的安全
2006/10/09 PHP
Apache 配置详解(最好的APACHE配置教程)
2010/07/04 PHP
php 生成文字png图片的代码
2011/04/17 PHP
深入php socket的讲解与实例分析
2013/06/13 PHP
PHP读取文件内容后清空文件示例代码
2014/03/18 PHP
ThinkPHP 3.2 数据分页代码分享
2014/10/14 PHP
php用户注册时常用的检验函数实例总结
2014/12/22 PHP
php语言中使用json的技巧及json的实现代码详解
2015/10/27 PHP
javascript options属性集合操作代码
2009/12/28 Javascript
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
2016/09/17 Javascript
两种简单的跨域方法(jsonp、php)
2017/01/02 Javascript
node文件上传功能简易实现代码
2017/06/16 Javascript
ES6 proxy和reflect的使用方法与应用实例分析
2020/02/15 Javascript
[02:00]最后,我终于出了辉耀
2018/03/27 DOTA
关于Python中空格字符串处理的技巧总结
2017/08/10 Python
python入门教程 python入门神图一张
2018/03/05 Python
windows下python安装小白入门教程
2018/09/18 Python
Python基础之文件读取的讲解
2019/02/16 Python
Python类的绑定方法和非绑定方法实例解析
2020/03/04 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
Python如何对XML 解析
2020/06/28 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
在vscode中启动conda虚拟环境的思路详解
2020/12/25 Python
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
原材料检验岗位职责
2014/03/15 职场文书
给老婆的道歉信
2015/01/20 职场文书
离婚上诉状范文
2015/05/23 职场文书
详细了解MVC+proxy
2021/07/09 Java/Android
logback如何自定义日志存储
2021/08/30 Java/Android
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/06 PostgreSQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
2023/05/08 MySQL