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模拟按下回车实现代码
Sep 20 Javascript
JavaScript中两个感叹号的作用说明
Dec 28 Javascript
js变量、作用域及内存详解
Sep 23 Javascript
js实现图片放大和拖拽特效代码分享
Sep 05 Javascript
jQuery 生成svg矢量二维码
Aug 09 Javascript
javascript的几种写法总结
Sep 30 Javascript
Boostrap实现的登录界面实例代码
Oct 09 Javascript
JS实现浏览器打印、打印预览示例
Feb 28 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
Jun 30 Javascript
Node.js原生api搭建web服务器的方法步骤
Feb 15 Javascript
turn.js异步加载实现翻书效果
Jul 25 Javascript
LayUI+Shiro实现动态菜单并记住菜单收展的示例
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
PHP高级对象构建 工厂模式的使用
2012/02/05 PHP
php使用$_POST或$_SESSION[]向js函数传参
2014/09/16 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
2016/05/13 PHP
快速解决PHP调用Word组件DCOM权限的问题
2017/12/27 PHP
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
什么是DOM(Document Object Model)文档对象模型
2012/03/05 Javascript
jQuery中将函数赋值给变量的调用方法
2012/03/23 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
JavaScript Math.floor方法(对数值向下取整)
2015/01/09 Javascript
jquery图片切换实例分析
2015/04/15 Javascript
以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题
2015/11/13 Javascript
jQuery表格插件datatables用法详解
2020/11/23 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
2016/12/01 Javascript
jQuery实现删除li节点的方法
2016/12/06 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
2017/02/20 Javascript
深入浅析JS中的严格模式
2018/06/04 Javascript
简单了解JavaScript弹窗实现代码
2020/05/07 Javascript
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
Python实现竖排打印传单手机号码易撕条
2015/03/16 Python
在Lighttpd服务器中运行Django应用的方法
2015/07/22 Python
flask框架视图函数用法示例
2018/07/19 Python
基于python实现简单日历
2018/07/28 Python
学生信息管理系统python版
2018/10/17 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
Python unittest 自动识别并执行测试用例方式
2020/03/09 Python
Python实现异步IO的示例
2020/11/05 Python
CSS3实现彩色进度条动画的示例
2020/10/29 HTML / CSS
北京振戎融通Java面试题
2015/09/03 面试题
酒店节能降耗方案
2014/05/08 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
优秀护士事迹材料
2014/12/25 职场文书
结婚幸福感言
2015/08/01 职场文书
大学生十八大感想
2015/08/11 职场文书
2019最新公司租房合同(例文)
2019/07/18 职场文书
python+opencv实现目标跟踪过程
2022/06/21 Python