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』名称冲突使用noConflict方法解决
Apr 22 Javascript
javascript alert乱码的解决方法
Nov 05 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
Jan 02 Javascript
checkbox选中与未选中判断示例
Aug 04 Javascript
浅谈javascript的Array.prototype.slice.call
Aug 31 Javascript
JS 对java返回的json格式的数据处理方法
Dec 05 Javascript
javascript 闭包详解及简单实例应用
Dec 31 Javascript
Angular之toDoList的实现代码示例
Dec 02 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
Jan 03 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
Dec 11 jQuery
实现一个 Vue 吸顶锚点组件方法
Jul 10 Javascript
微信小程序scroll-view的滚动条设置实现
Mar 02 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
Zend引擎的发展 [15]
2006/10/09 PHP
fleaphp下不确定的多条件查询的巧妙解决方法
2008/09/11 PHP
php 什么是PEAR?(第二篇)
2009/03/19 PHP
PHP中new static()与new self()的区别异同分析
2014/08/22 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
一段非常简单的让图片自动切换js代码
2006/11/10 Javascript
jquery动画1.加载指示器
2012/08/24 Javascript
jquery三个关闭弹出层的小示例
2013/11/05 Javascript
将查询条件的input、select清空
2014/01/14 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
2015/12/29 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
JavaScript读写二进制数据的方法详解
2018/09/09 Javascript
在vue项目中引用Iview的方法
2018/09/14 Javascript
深入理解 JS 垃圾回收
2019/06/03 Javascript
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
微信小程序背景音乐开发详解
2019/12/12 Javascript
Vue Object 的变化侦测实现代码
2020/04/15 Javascript
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[52:03]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第三场 1月31日
2021/03/11 DOTA
python实现基于SVM手写数字识别功能
2020/05/27 Python
Python读取txt某几列绘图的方法
2018/10/14 Python
Python如何实现动态数组
2019/11/02 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
2019/11/21 Python
HTML5中的拖放实现详解
2017/08/23 HTML / CSS
有机童装:Toby Tiger
2018/05/23 全球购物
俄罗斯名牌服装网上商店:UNIQUE FABRIC
2019/07/25 全球购物
英国现代、当代和设计师家具店:Furntastic
2020/07/18 全球购物
软件测试工程师结构化面试题库
2016/11/23 面试题
电工工作职责范本
2014/02/22 职场文书
爱祖国爱家乡演讲稿
2014/09/02 职场文书
镇班子对照检查材料思想汇报
2014/09/24 职场文书
中班下学期个人工作总结
2015/02/12 职场文书
创卫工作总结2015
2015/04/22 职场文书
护理自荐信
2019/05/14 职场文书