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 相关文章推荐
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
Dec 11 Javascript
jQuery动态添加、删除元素的方法
Jan 09 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
Aug 18 Javascript
基于jQuery实现的文字按钮表单特效整理
Dec 07 Javascript
bootstrap实现弹窗和拖动效果
Jan 03 Javascript
angularjs路由传值$routeParams详解
Sep 05 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
Feb 09 Javascript
vue.js使用3DES加密的方法示例
May 18 Javascript
Vue框架下引入ActiveX控件的问题解决
Mar 25 Javascript
JavaScript实现Tab选项卡切换
Feb 13 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
Mar 25 Javascript
Vue自动构建发布脚本的方法示例
Jul 24 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 正则学习实例
2008/07/30 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
PHP获取二叉树镜像的方法
2018/01/17 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
use jscript with List Proxy Server Information
2007/06/11 Javascript
js String对象中常用方法小结(字符串操作)
2012/01/27 Javascript
如何将JS的变量值传递给ASP变量
2012/12/10 Javascript
js获取IP和PcName(IE)在vs中可用
2013/08/02 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
js清除input中type等于file的值域(示例代码)
2013/12/24 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
jQuery插件简单实现方法
2015/07/18 Javascript
jquery实现可关闭的倒计时广告特效代码
2015/09/02 Javascript
用原生JS对AJAX做简单封装的实例代码
2016/07/13 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
jQuery UI 实例讲解 - 日期选择器(Datepicker)
2017/09/18 jQuery
jQuery图片加载失败替换默认图片方法汇总
2017/11/29 jQuery
vue之将echart封装为组件
2018/06/02 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
Electron 调用命令行(cmd)
2019/09/23 Javascript
JavaScript实现打字游戏
2021/02/19 Javascript
python之pandas用法大全
2018/03/13 Python
用python做游戏的细节详解
2019/06/25 Python
django页面跳转问题及注意事项
2019/07/18 Python
python 的 scapy库,实现网卡收发包的例子
2019/07/23 Python
python随机生成库faker库api实例详解
2019/11/28 Python
5分钟快速掌握Python定时任务框架的实现
2021/01/26 Python
css3 盒模型以及box-sizing属性全面了解
2016/09/20 HTML / CSS
HTML5 Web 存储详解
2016/09/16 HTML / CSS
人力资源经理自我评价
2014/01/04 职场文书
高三自我评价
2014/02/01 职场文书
周年庆典主持词
2014/04/02 职场文书
关于公司年会的开幕词
2016/03/04 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
合作意向书怎么写
2019/06/24 职场文书