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实现table单双行不同显示并能单行选中
Jul 25 Javascript
用jQuery打造TabPanel效果代码
May 22 Javascript
自写简单JS判断是否已经弹出页面
Oct 20 Javascript
纯js网页画板(Graphics)类简介及实现代码
Dec 24 Javascript
javascript实现的元素拖动函数宿主为浏览器
Jul 21 Javascript
JS中FRAME的操作问题实例分析
Oct 21 Javascript
详解AngularJS中$http缓存以及处理多个$http请求的方法
Feb 06 Javascript
利用node.js+mongodb如何搭建一个简单登录注册的功能详解
Jul 30 Javascript
JS文件中加载jquery.js的实例代码
May 05 jQuery
利用node 判断打开的是文件 还是 文件夹的实例
Jun 10 Javascript
vue配置nprogress实现页面顶部进度条
Sep 21 Javascript
Element Cascader 级联选择器的使用示例
Jul 27 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
用Simple Excel导出xls实现方法
2012/12/06 PHP
基于initPHP的框架介绍
2013/04/18 PHP
php 数组字符串搜索array_search技巧
2016/07/05 PHP
PHP实现留言板功能的详细代码
2017/03/25 PHP
jQuery 行背景颜色的交替显示(隔行变色)实现代码
2009/12/13 Javascript
jquery给图片添加鼠标经过时的边框效果
2013/11/12 Javascript
JS组件Bootstrap实现弹出框和提示框效果代码
2015/12/08 Javascript
AngularJs 弹出模态框(model)
2016/04/07 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
基于JavaScript实现右键菜单和拖拽功能
2016/11/28 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
2018/08/28 Javascript
webpack file-loader和url-loader的区别
2019/01/15 Javascript
了解重排与重绘
2019/05/29 Javascript
Vue数据绑定实例写法
2019/08/06 Javascript
javascript的惯性运动实现代码实例
2019/09/07 Javascript
使用js实现一个简单的滚动条过程解析
2019/09/10 Javascript
使用python绘制常用的图表
2016/08/27 Python
Python做文本按行去重的实现方法
2016/10/19 Python
opencv python如何实现图像二值化
2020/02/03 Python
css3使网页、图片变成灰色兼容大多数浏览器
2014/07/02 HTML / CSS
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
豆腐の盛田屋官网:日本自然派的豆乳面膜、肥皂、化妆水、乳液等
2016/10/08 全球购物
Mistine官方海外旗舰店:泰国国民彩妆品牌
2016/12/28 全球购物
上课迟到检讨书
2014/02/19 职场文书
感恩寄语大全
2014/04/11 职场文书
煤矿安全生产责任书
2014/04/15 职场文书
小学作文评语大全
2014/04/21 职场文书
国际商务英语专业求职信
2014/07/08 职场文书
私营公司诉讼代理委托书范本
2014/09/13 职场文书
群众路线教育党员自我剖析材料
2014/10/06 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
上班迟到检讨书范文300字
2014/11/02 职场文书
Python opencv缺陷检测的实现及问题解决
2021/04/24 Python
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python
GoFrame框架数据校验之校验结果Error接口对象
2022/06/21 Golang