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 相关文章推荐
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
Mar 21 Javascript
JQUERY dialog的用法详细解析
Dec 19 Javascript
JavaScript中的单引号和双引号报错的解决方法
Sep 01 Javascript
javascript每日必学之循环
Feb 19 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
May 03 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
May 17 Javascript
BootStrap table表格插件自适应固定表头(超好用)
Aug 24 Javascript
Javascrip实现文字跳动特效
Nov 27 Javascript
Javascript中将变量转换为字符串的三种方法
Sep 19 Javascript
使用vue2.0创建的项目的步骤方法
Sep 25 Javascript
微信小程序商品详情页底部弹出框
Nov 22 Javascript
nestjs返回给前端数据格式的封装实现
Feb 22 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 ajax实现文件上传进度条
2016/03/29 PHP
PHP 匿名函数与注意事项详细介绍
2016/11/26 PHP
yii2-GridView在开发中常用的功能及技巧总结
2017/01/07 PHP
PDO::_construct讲解
2019/01/27 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
2019/12/04 PHP
Microsoft Ajax Minifier 压缩javascript的方法
2010/03/05 Javascript
javascript中加var和不加var的区别 你真的懂吗
2016/01/06 Javascript
Bootstrap项目实战之子栏目资讯内容
2016/04/25 Javascript
JS新包管理工具yarn和npm的对比与使用入门
2016/12/09 Javascript
一个例子轻松学会Vue.js
2017/01/02 Javascript
详解jquery validate实现表单验证 (正则表达式)
2017/01/18 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
2017/08/16 Javascript
轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
2017/09/06 Javascript
JS实现仿微信支付弹窗功能
2018/06/25 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
vue-router 中 meta的用法详解
2019/11/01 Javascript
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
2020/07/09 Javascript
原生js生成图片验证码
2020/10/11 Javascript
JavaScript 实现继承的几种方式
2021/02/19 Javascript
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
Python 实现一行输入多个值的方法
2018/04/21 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
python框架中flask知识点总结
2018/08/17 Python
python制作填词游戏步骤详解
2019/05/05 Python
Python Pygame实现俄罗斯方块
2021/02/19 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
餐厅总经理岗位职责
2013/12/31 职场文书
小学开学典礼主持词
2014/03/19 职场文书
机械专业应届毕业生自荐书
2014/06/12 职场文书
项目申请汇报材料
2014/08/16 职场文书
2014年纪检工作总结
2014/11/12 职场文书
2014小学数学教师个人工作总结
2014/12/18 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
2021/04/03 Javascript
Python音乐爬虫完美绕过反爬
2021/08/30 Python