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 相关文章推荐
一实用的实现table排序的Javascript类库
Sep 12 Javascript
JQuery下关于$.Ready()的分析
Dec 13 Javascript
js 程序执行与顺序实现详解
May 13 Javascript
Javascript 拖拽的一些简单的应用(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 Javascript
JavaScript判断表单为空及获取焦点的方法
Feb 12 Javascript
相册展示PhotoSwipe.js插件实现
Aug 25 Javascript
Bootstrap组合上、下拉框简单实现代码
Mar 06 Javascript
Angular中自定义Debounce Click指令防止重复点击
Jul 26 Javascript
了解ESlint和其相关操作小结
May 21 Javascript
js 动态校验开始结束时间的实现代码
May 25 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
Sep 04 Javascript
原生JS实现拖拽效果
Dec 04 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
php基础知识:类与对象(2) 自动加载对象
2006/12/13 PHP
yii实现使用CUploadedFile上传文件的方法
2015/12/28 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
2017/06/21 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
解决laravel查询构造器中的别名问题
2019/10/17 PHP
JS option location 页面跳转实现代码
2008/12/27 Javascript
javascript实现节点(div)名称编辑
2014/12/17 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
2016/05/09 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
2018/04/26 jQuery
jquery ajax加载数据前台渲染方式 不用for遍历的方法
2018/08/09 jQuery
自己动手封装一个React Native多级联动
2018/09/19 Javascript
Angular4 Select选择改变事件的方法
2018/10/09 Javascript
layui插件表单验证提交触发提交的例子
2019/09/09 Javascript
用云开发Cloudbase实现小程序多图片内容安全监测的代码详解
2020/06/07 Javascript
Python中__init__和__new__的区别详解
2014/07/09 Python
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
2014/07/11 Python
Python常用正则表达式符号浅析
2014/08/13 Python
深入讨论Python函数的参数的默认值所引发的问题的原因
2015/03/30 Python
详解python的四种内置数据结构
2019/03/19 Python
python实现nao机器人身体躯干和腿部动作操作
2019/04/29 Python
pyqt 多窗口之间的相互调用方法
2019/06/19 Python
使用python绘制温度变化雷达图
2019/10/18 Python
Python之关于类变量的两种赋值区别详解
2020/03/12 Python
python3.8动态人脸识别的实现示例
2020/09/21 Python
Python os库常用操作代码汇总
2020/11/03 Python
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
法院实习人员自我鉴定
2013/09/26 职场文书
给酒店员工的表扬信
2014/01/11 职场文书
2014个人年度工作总结
2014/12/15 职场文书
仓管员岗位职责
2015/02/03 职场文书
研究生个人学年总结
2015/02/14 职场文书
vue中data改变后让视图同步更新的方法
2021/03/29 Vue.js
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python
Python NumPy灰度图像的压缩原理讲解
2021/08/04 Python