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 相关文章推荐
动态改变textbox的宽高的js
Oct 26 Javascript
JavaScript对象之间的转换 jQuery对象和原声DOM
Mar 07 Javascript
js中判断文本框是否为空的两种方法
Jul 31 Javascript
jQuery代码优化 选择符篇
Nov 01 Javascript
将form表单中的元素转换成对象的方法适用表单提交
May 02 Javascript
HTML,CSS,JavaScript速查表推荐
Dec 02 Javascript
jQuery()方法的第二个参数详解
Apr 29 Javascript
vue-cli 如何打包上线的方法示例
May 08 Javascript
react native 文字轮播的实现示例
Jul 27 Javascript
js实现数字跳动到指定数字
Aug 25 Javascript
js面试题之异步问题的深入理解
Sep 20 Javascript
js判断两个数组相等的5种方法
May 06 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
用Flash图形化数据(一)
2006/10/09 PHP
php木马攻击防御之道
2008/03/24 PHP
PHP引用符&的用法详细解析
2013/08/22 PHP
PHP、Python和Javascript的装饰器模式对比
2015/02/03 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
2015/03/05 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
2016/03/25 PHP
PHP编写简单的App接口
2016/08/28 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
2007/04/12 Javascript
jquery中对表单的基本操作代码
2010/07/29 Javascript
Javascript调用C#代码
2011/01/17 Javascript
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
nodeType属性返回被选节点的节点类型介绍
2013/11/22 Javascript
Javascript浅谈之引用类型
2013/12/18 Javascript
js replace替换所有匹配的字符串
2014/02/13 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
javascript拖拽应用实例
2016/03/25 Javascript
NodeJs下的测试框架Mocha的简单介绍
2017/02/22 NodeJs
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
2017/05/23 Javascript
JS同步、异步、延迟加载的方法
2018/05/05 Javascript
JavaScript隐式类型转换代码实例
2020/05/29 Javascript
JavaScript中条件语句的优化技巧总结
2020/12/04 Javascript
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
Python制作钉钉加密/解密工具
2016/12/07 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
提升Python效率之使用循环机制代替递归函数
2019/07/23 Python
python类的实例化问题解决
2019/08/31 Python
解决Python安装cryptography报错问题
2020/09/03 Python
C#面试常见问题
2013/02/25 面试题
会员卡清退活动总结
2014/08/27 职场文书
小学向国旗敬礼活动方案
2014/09/27 职场文书
2015年质量管理工作总结范文
2015/05/18 职场文书
班主任工作经验交流会总结
2015/11/02 职场文书