ES6中Proxy与Reflect实现重载(overload)的方法


Posted in Javascript onMarch 30, 2017

本文实例讲述了ES6中Proxy与Reflect实现重载(overload)的方法。分享给大家供大家参考,具体如下:

Proxy与Reflect实现重载(overload)

从语法角度讲JavaScript不支持重载。原因很简单,JS中函数可以传入任意类型、任意个数的参数,通通可以通过在函数内使用this.arguments获得。这样,就无法实现同名函数参数列表不同实现不同功能。当然,在实际使用过程中,可以人为去检测传入实参的个数及类型,来进行不同操作。但是,我认为这不能叫做重载。

ES6带来了Proxy和Reflect,配合使用可以实现重载。Proxy用于修改某些操作的默认行为,相当于对原始想进行的操作进行“包装”;Reflect对象的方法与Proxy对象的方法一一对应,这使得Proxy对象可以方便的调用对应的Reflect方法完成默认行为。我们可以这样使用它们:

function LogMessage( m ){
  this.m = m;
}
var message = new LogMessage( 1 );
var overload = new Proxy(message , {
  get: function(target, key, receiver){
    console.log(`getting ${key}`);
    return Reflect.get(target , key , receiver);
  },
  set: function(target, key, value, receiver){
    console.log(`setting ${key}`);
    return Reflect.set(target, key, value, receiver);
  }
});
overload.m = 2; //setting m
var s = overload.m; //getting m

看到了没,是不是很有意思,新创建的Proxy对象overload可以完成目标对象message的操作,同时,可以通过在默认操作之前自定义一些其他操作。我认为,这更像Java里的重载。

那么Proxy与Reflect有哪些实例方法呢?

1.get()
用于拦截某个属性的读取操作。

2.set()
用于拦截某个属性的赋值操作。

3.has()
可以隐藏某些属性,不被in操作符遍历到。

4.construct()
用于拦截new命令。

5.deleteProperty()
用于拦截delete操作。

6.defineProperty()
用于拦截Object.defineProperty操作。

7.enumerate()
用于拦截for...in循环。

8.getOwnPropertyDescriptor()
用于拦截Object.getOwnPropertyDescriptor操作。

9.isExtensible()
用于拦截Object.isExtensible操作。

10.preventExtensions()
用于拦截Object.preventExtensions操作。

11.setPrototypeOf()
用于拦截Object.setPrototypeOf操作。

上面很多方法不是很常用,如果感兴趣可以去查查相关资料

希望本文所述对大家ECMAScript程序设计有所帮助。

Javascript 相关文章推荐
[原创]保存的js无法执行的解决办法
Feb 25 Javascript
网页和浏览器兼容性问题汇总(draft1)
Jun 01 Javascript
Javascript this指针
Jul 30 Javascript
jquery下组织javascript代码(js函数化)
Aug 25 Javascript
JS图片预加载 JS实现图片预加载应用
Dec 03 Javascript
基于jquery中children()与find()的区别介绍
Apr 26 Javascript
jQuery中:last-child选择器用法实例
Dec 31 Javascript
使用Jquery实现每日签到功能
Apr 03 Javascript
简介JavaScript中的setDate()方法的使用
Jun 11 Javascript
jQuery实现hover合成事件的方法
Aug 06 Javascript
JavaScript实现计算多边形质心的方法示例
Jan 31 Javascript
Webpack之tree-starking 解析
Sep 11 Javascript
vue分类筛选filter方法简单实例
Mar 30 #Javascript
教你快速搭建Node.Js服务器的方法教程
Mar 30 #Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
Mar 30 #Javascript
canvas绘制一个常用的emoji表情
Mar 30 #Javascript
JavaScript装饰器函数(Decorator)实例详解
Mar 30 #Javascript
Angular.JS去掉访问路径URL中的#号详解
Mar 30 #Javascript
详解Angular.js数据绑定时自动转义html标签及内容
Mar 30 #Javascript
You might like
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
PHP实现的英文名字全拼随机排号脚本
2014/07/04 PHP
php实现在服务器端调整图片大小的方法
2015/06/16 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
2016/03/15 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
2020/05/02 PHP
Prototype ObjectRange对象学习
2009/07/19 Javascript
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
实现网页页面跳转的几种方法(meta标签、js实现、php实现)
2014/05/20 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
2018/09/28 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
js实现AI五子棋人机大战
2020/05/28 Javascript
基于JavaScript判断两个对象内容是否相等
2020/01/10 Javascript
详解vue-router的Import异步加载模块问题的解决方案
2020/05/13 Javascript
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
[33:33]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第二场 11.27
2020/11/30 DOTA
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
Python实现比较两个列表(list)范围
2015/06/12 Python
python 日志增量抓取实现方法
2018/04/28 Python
Python argparse模块应用实例解析
2019/11/15 Python
在python中利用dict转json按输入顺序输出内容方式
2020/02/27 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
Python生成器实现简单"生产者消费者"模型代码实例
2020/03/27 Python
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
使用phonegap创建联系人的实现方法
2017/03/30 HTML / CSS
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
不打扫卫生检讨书
2014/02/12 职场文书
离婚协议书范本2014
2014/10/27 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python
使用Redis实现秒杀功能的简单方法
2021/05/08 Redis
利用python Pandas实现批量拆分Excel与合并Excel
2021/05/23 Python