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框架veryide.librar源代码
Mar 05 Javascript
Jquery 1.42 checkbox 全选和反选代码
Mar 27 Javascript
JavaScript弹出窗口方法汇总
Aug 12 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
Feb 25 Javascript
jquery插件ajaxupload实现文件上传操作
Dec 09 Javascript
基于JS实现新闻列表无缝向上滚动实例代码
Jan 22 Javascript
JavaScript ES5标准中新增的Array方法
Jun 28 Javascript
jQuery 3.0十大新特性最终版发布
Jul 14 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
Feb 19 Javascript
原生JS仿QQ阅读点击展开、收起效果
Mar 08 Javascript
详解Vue.js入门环境搭建
Mar 17 Javascript
了解JavaScript中let语句
May 30 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 数据库树的遍历方法
2009/02/06 PHP
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
记录PHP错误日志 display_errors与log_errors的区别
2012/10/09 PHP
php cli 小技巧
2013/06/03 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
2017/06/07 PHP
TNC vs IO BO3 第一场2.13
2021/03/10 DOTA
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
jQuery动画animate方法使用介绍
2013/05/06 Javascript
jQuery插件实现控制网页元素动态居中显示
2015/03/24 Javascript
jquery实现点击变换导航样式的方法
2015/08/31 Javascript
利用JS实现数字增长
2016/07/28 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
JS简单实现获取元素的封装操作示例
2017/04/07 Javascript
Vue.js实现的表格增加删除demo示例
2018/05/22 Javascript
微信小程序下拉框功能的实例代码
2018/11/06 Javascript
javascript实现京东登录显示隐藏密码
2020/08/02 Javascript
Python的Tornado框架实现图片上传及图片大小修改功能
2016/06/30 Python
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
Python闭包和装饰器用法实例详解
2019/05/22 Python
Python笔试面试题小结
2019/09/07 Python
python求质数列表的例子
2019/11/24 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
2020/02/15 Python
JupyterNotebook 输出窗口的显示效果调整方法
2020/04/13 Python
Django如何重置migration的几种情景
2021/02/24 Python
英国最大的宠物食品和宠物用品网上零售商: Zooplus
2016/08/01 全球购物
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
局域网定义和特性
2016/01/23 面试题
平安工地建设方案
2014/05/06 职场文书
2015大一新生军训感言
2015/08/01 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书
导游词之镜泊湖
2019/12/09 职场文书
Python类方法总结讲解
2021/07/26 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
2022/04/07 Python