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 相关文章推荐
json跟xml的对比分析
Jun 10 Javascript
jQuery中的.bind()、.live()和.delegate()之间区别分析
Jun 08 Javascript
js控制容器隐藏出现防止样式变化的两种方法
Apr 25 Javascript
node.js使用require()函数加载模块
Nov 26 Javascript
jQuery中:submit选择器用法实例
Jan 03 Javascript
解决jquery中动态新增的元素节点无法触发事件问题的两种方法
Oct 30 Javascript
AngularJS基础 ng-href 指令用法
Aug 01 Javascript
vue实现表格增删改查效果的实例代码
Jul 18 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
Nov 10 Javascript
JavaScript引用类型Function实例详解
Aug 09 Javascript
node使用Mongoose类库实现简单的增删改查
Nov 08 Javascript
vue+Element中table表格实现可编辑(select下拉框)
May 21 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实现ftp上传文件示例
2014/08/21 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
laravel 去掉index.php伪静态的操作方法
2019/10/12 PHP
Yii框架布局文件的动态切换操作示例
2019/11/11 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
2020/10/20 PHP
表单内同名元素的控制
2006/11/22 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
2011/07/31 Javascript
js中的布尔运算符使用介绍
2013/11/20 Javascript
jquery自动将form表单封装成json的具体实现
2014/03/17 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
2015/10/08 Javascript
AngularJS入门教程之AngularJS表达式
2016/04/18 Javascript
jquery点击切换背景色的简单实例
2016/08/25 Javascript
JS中常用的正则表达式
2016/09/29 Javascript
JavaScript html5利用FileReader实现上传功能
2020/03/27 Javascript
highcharts 在angular中的使用示例代码
2017/09/20 Javascript
对mac下nodejs 更新到最新版本的最新方法(推荐)
2018/05/17 NodeJs
JS立即执行函数功能与用法分析
2019/01/15 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
vue.js实现三级菜单效果
2019/10/19 Javascript
[48:00]EG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/29 DOTA
Python PyQt5实现的简易计算器功能示例
2017/08/23 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
2019/03/05 Python
Python Numpy 实现交换两行和两列的方法
2019/06/26 Python
详解用Python爬虫获取百度企业信用中企业基本信息
2020/07/02 Python
CSS3 please 跨浏览器的CSS3产生器
2010/03/14 HTML / CSS
COS美国官网:知名服装品牌
2019/04/08 全球购物
分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题)
2014/07/16 面试题
资产评估专业大学生求职信
2013/09/29 职场文书
幼儿园家长会邀请函
2014/01/15 职场文书
开业庆典主持词
2014/03/21 职场文书
爱祖国爱家乡演讲稿
2014/09/02 职场文书
乡镇机关党员民主评议表自我评价
2014/09/21 职场文书
2015年市场部工作总结
2015/04/30 职场文书
浅谈Python中的正则表达式
2021/06/28 Python
python基础之文件操作
2021/10/24 Python
HTML中link标签属性的具体用法
2023/05/07 HTML / CSS