5分钟快速看懂ES6中的反射与代理


Posted in Javascript onDecember 19, 2019

反射:Reflect

反射到底是个什么东西?

它的本质就是一个对象(JS内置的),里边有一些函数可供调用。

5分钟快速看懂ES6中的反射与代理

为什要叫做反射?

因为它能做的事情,和其他语言(Java、python等)中的反射很相似。其他语言中都叫做反射了,那就共鸣(降低学习成本?)

反射能做什么事情呢?

let animal = {
 name: "dog",
 age: 3
}
Reflect.get(animal, "name") // 传参为:对象, 属性名
// 等同于:
animal.name 

let say = function (type, sound) {
 console.log(`${type}的叫声是${sound}`)
}
Reflect.apply(say, null, ["猫", "喵喵"]) // 传参为:函数, this指向, 实参列表
// 等同于:
say("猫", "喵喵")

经过以上代码我们深刻的发现Reflect好像没什么用,非要说些什么的话,他把我们以前的基本操作(比如:obj.name)用调用函数的方式实现了一遍。对了这就是它的意义:减少JS语言魔法,让代码更加纯粹。

怎么说?

JS语言魔法:我们的操作看起来不太合理,超乎寻常,难以解释。

解释一波,Reflect.get(animal, "name")你看着个代码它又宽又长,看着好像我们要得到 animal 这个对象中 name 这个属性的值的意思。

再看看animal.name 震惊!只需要这样,就得到了对象中的属性的值,虽然学习过JS的伙伴们觉得很正常,但是我们不太能用语言去描述这段代码做了什么,这就是语言魔法的意思。

想必大家已经对反射有一定了解了,Reflect对象上还有一些其他方法。大家可以看文档研究一下怎么用,

代理:Proxy

代理到底是个什么东西?

我们都听过什么代理商、还有代理服务器之类的。比如哪代理服务器来说,我们不能直接访问到服务器,我们必须要去访问代理服务器,由代理服务器代替我们去访问服务器,服务器返回的数据,也要先返回给代理服务器,再由代理服务器返回给我们。

ES6中的代理也是这个意思,我们可以去代理一个对象类型的数据(函数、对象等),然后我们再去访问对象时,访问代理就好了。

为啥我们要访问代理?

因为代理对象给我们提供了修改底层实现的方式,也就是说我们可以在代理对象上进行一些操作,为我们访问对象制定一些规则。就像代理服务器可以过滤某些对服务器的访问等功能。

怎么操作?

Proxy的本质是一个构造函数,

new Proxy(obj, {
 // 一些规则
})

这样我们就构造出了一个obj对象的一个代理对象,第二个参数是一个对象它为访问obj对象制定了一些规章制度。

new Proxy(obj, {
 get(target, prop){
  // some code
  return Reflect.get(target, prop)
 }
})

这就是在创建代理对象是制定规则的场景,对比一下Reflect,是不是很想呢。确实反射经常配合Proxy使用

应用:

比如:

function sum(num1, num2){
 return num1 + num2;
}

现在我们为sum函数的传参制定一些规则:参数必需是number类型的

const sunProxy = new Proxy(sum, {
 apply(target, thisArgument, arguments) {
  arguments.forEach(item => {
   typeof item !== "number" && throw("参数类型非number")
  })
  return Reflect.apply(target, thisArgument, arguments)
 }
})
sunProxy(23, 32)

封装一下,搞一个通用类型出来

function funcProxy(func, ...types) 
 //执行完这个函数返回一个函数的代理,剩余参数是我们规定的传参类型
  return new Proxy(func, {
  apply(target, thisArgument, argumentsList) {
   types.forEach((type, index) => {
   // 循环判断每一项参数类型是否合法
    typeof argumentsList[index] !== type && throw("传参类型不符合")
      }
     })
   return Reflect.apply(target, thisArgument, argumentsList);
    }
   })
  }

然后:

const sumProxy = funcProxy(sum, "number", "number")
sumProxy(3, 5);

使用反射我们可以实现一些底层操作,代理可以为我们的调用制定规则。

是不是很有趣呢大家。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
常见JS效果之图片减速度滚动实现代码
Dec 08 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
Mar 24 Javascript
javascript实现控制文字大中小显示
Apr 28 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
May 08 Javascript
jquery简单实现图片切换效果的方法
May 12 Javascript
JS实现左右拖动改变内容显示区域大小的方法
Oct 13 Javascript
JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法
May 19 Javascript
前端编码规范(3)JavaScript 开发规范
Jan 21 Javascript
jQuery层级选择器实例代码
Feb 06 Javascript
node通过npm写一个cli命令行工具
Oct 12 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
May 27 Javascript
Vue + element 实现多选框组并保存已选id集合的示例代码
Jun 03 Javascript
d3.js实现图形拖拽
Dec 19 #Javascript
d3.js实现图形缩放平移
Dec 19 #Javascript
微信小程序批量上传图片到七牛(推荐)
Dec 19 #Javascript
echarts实现折线图的拖拽效果
Dec 19 #Javascript
Vue中使用Lodop插件实现打印功能的简单方法
Dec 19 #Javascript
Echarts实现单条折线可拖拽效果
Dec 19 #Javascript
Webpack设置环境变量的一些误区详解
Dec 19 #Javascript
You might like
PHP获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
HTML-CSS群中单选引发的“事件”
2007/03/05 Javascript
js程序中美元符号$是什么
2008/06/05 Javascript
jquery判断checkbox(复选框)是否被选中的代码
2010/10/20 Javascript
图片轮换效果实现代码(点击按钮停止执行)
2013/04/12 Javascript
js获取select标签的值且兼容IE与firefox
2013/12/30 Javascript
利用JS解决ie6不支持max-width,max-height问题的方法
2014/01/02 Javascript
js charAt的使用示例
2014/02/18 Javascript
js中confirm实现执行操作前弹出确认框的方法
2014/11/01 Javascript
node.js中实现同步操作的3种实现方法
2014/12/05 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
浅析Bootstrap验证控件的使用
2016/06/23 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
2017/04/11 Javascript
angular 基于ng-messages的表单验证实例
2017/05/04 Javascript
react-router4按需加载(踩坑填坑)
2019/01/06 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
[59:07]海涛为你详解DOTA2新版本“贤哲秘契”
2014/11/22 DOTA
[36:33]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第二场
2018/04/04 DOTA
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
2014/05/06 Python
在Python中使用判断语句和循环的教程
2015/04/25 Python
Python的Django框架下管理站点的基本方法
2015/07/17 Python
python实现根据指定字符截取对应的行的内容方法
2018/10/23 Python
python实现连续图文识别
2018/12/18 Python
Python列表(List)知识点总结
2019/02/18 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
2020/03/24 Python
CSS3 linear-gradient线性渐变生成加号和减号的方法
2017/11/21 HTML / CSS
"序列点" 是什么
2016/07/29 面试题
环境科学毕业生自荐信
2013/11/21 职场文书
25岁生日感言
2014/01/13 职场文书
开工仪式主持词
2014/03/20 职场文书
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
JavaScript实现班级抽签小程序
2021/05/19 Javascript
Python3使用Qt5来实现简易的五子棋小游戏
2022/05/02 Python
numpy array找出符合条件的数并赋值的示例代码
2022/06/01 Python