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 相关文章推荐
Jquery 学习笔记(一)
Oct 13 Javascript
JS 文件传参及处理技巧分析
May 13 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
Jan 14 Javascript
js与运算符和或运算符的妙用
Feb 14 Javascript
jquery遍历checkbox介绍
Feb 21 Javascript
Js+Ajax,Get和Post在使用上的区别小结
Jun 08 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
Jun 30 Javascript
微信小程序 图片上传实例详解
May 05 Javascript
jQuery为某个div加入行样式
Jun 09 jQuery
vue实现的树形结构加多选框示例
Feb 02 Javascript
vue中实现图片压缩 file文件的方法
May 28 Javascript
vue实现折线图 可按时间查询
Aug 21 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 模拟POST|GET操作实现代码
2010/07/20 PHP
PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
2012/08/31 PHP
详解WordPress中分类函数wp_list_categories的使用
2016/01/04 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
DWZ table的原生分页浅谈
2013/03/01 Javascript
用innerhtml提高页面打开速度的方法
2013/08/02 Javascript
jquery实现背景墙聚光灯效果示例分享
2014/03/02 Javascript
jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
2014/11/19 Javascript
JS中的进制转换以及作用
2016/06/26 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
Angular4 中常用的指令入门总结
2017/06/12 Javascript
详解webpack+vue-cli项目打包技巧
2017/06/17 Javascript
React 子组件向父组件传值的方法
2017/07/24 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
JavaScript实现的开关灯泡点击切换特效示例
2019/07/08 Javascript
举例讲解Python中的算数运算符的用法
2015/05/13 Python
浅谈Python中的闭包
2015/07/08 Python
Pandas 同元素多列去重的实例
2018/07/03 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
python复制列表时[:]和[::]之间有什么区别
2018/10/16 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
使用python模拟命令行终端的示例
2019/08/13 Python
python中用logging实现日志滚动和过期日志删除功能
2019/08/20 Python
python 遗传算法求函数极值的实现代码
2020/02/11 Python
马来西亚最热门的在线时尚商店:FashionValet
2018/11/11 全球购物
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
武汉英思工程科技有限公司–ORACLE面试测试题目
2012/04/30 面试题
.net软件工程师面试题
2015/03/31 面试题
实习单位接收函
2014/01/11 职场文书
详细的大学生创业计划书模板
2014/01/27 职场文书
感恩教育月活动总结
2014/07/07 职场文书
幼师辞职信怎么写
2015/02/27 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
社区挂职锻炼个人工作总结
2015/10/23 职场文书