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下的几个你可能没用过的功能
Aug 29 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
Feb 16 Javascript
实用框架(iframe)操作代码
Oct 23 Javascript
JS学习之表格的排序简单实例
May 16 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
May 28 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
Oct 12 Javascript
如何提高Dom访问速度
Jan 05 Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
Aug 23 jQuery
webstrom Debug 调试vue项目的方法步骤
Jul 17 Javascript
vue配置接口域名方法总结
May 12 Javascript
微信小程序自定义可滑动顶部TabBar选项卡实现页面切换功能示例
May 14 Javascript
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
Nov 20 Vue.js
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
咖啡豆要不要放冰箱的原因
2021/03/04 冲泡冲煮
PHP 登录记住密码实现思路
2013/05/07 PHP
通过curl模拟post和get方式提交的表单类
2014/04/23 PHP
php判断电脑访问、手机访问的例子
2014/05/10 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
2016/03/07 PHP
将两个div左右并列显示并实现点击标题切换内容
2013/10/22 Javascript
使用js写的一个简易的投票
2013/11/27 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
vue 全选与反选的实现方法(无Bug 新手看过来)
2018/02/09 Javascript
浅谈Vue Element中Select下拉框选取值的问题
2018/03/01 Javascript
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
vue使用websocket的方法实例分析
2019/06/22 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
2019/07/16 Javascript
微信小程序动态设置图片大小的方法
2019/11/21 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
python3图片转换二进制存入mysql
2013/12/06 Python
python+mysql实现简单的web程序
2014/09/11 Python
Python中获取对象信息的方法
2015/04/27 Python
Python处理Excel文件实例代码
2017/06/20 Python
Python删除Java源文件中全部注释的实现方法
2017/08/30 Python
利用python3随机生成中文字符的实现方法
2017/11/24 Python
python 中if else 语句的作用及示例代码
2018/03/05 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
selenium在执行phantomjs的API并获取执行结果的方法
2018/12/17 Python
Python语言进阶知识点总结
2019/05/28 Python
python opencv 二值化 计算白色像素点的实例
2019/07/03 Python
python正则表达式实例代码
2020/03/03 Python
购买澳大利亚最好的服装和内衣在线:BONDS
2016/10/14 全球购物
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
办公室驾驶员岗位职责
2013/11/15 职场文书
学生病假条怎么写
2015/08/17 职场文书
2019如何书写演讲稿?
2019/07/01 职场文书
小学生作文之《压岁钱的烦恼》
2019/09/27 职场文书
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS