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 ajax学习笔记2 使用XMLHttpRequest对象的responseXML
Oct 16 Javascript
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
Dec 11 Javascript
JScript分割字符串示例代码
Sep 04 Javascript
js 走马灯简单实例
Nov 21 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
Jan 12 Javascript
jquery ajax局部加载方法详解(实现代码)
May 12 Javascript
socket.io学习教程之深入学习篇(三)
Apr 29 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
Sep 02 Javascript
微信小程序之选项卡的实现方法
Sep 29 Javascript
vue自定v-model实现表单数据双向绑定问题
Sep 03 Javascript
js中怎么判断两个字符串相等的实例
Jan 17 Javascript
vue 中 命名视图的用法实例详解
Aug 14 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限制页面只能在微信自带浏览器访问的代码
2014/01/15 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
2017/03/16 PHP
实例分析10个PHP常见安全问题
2019/07/09 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
javascript 鼠标拖动图标技术
2010/02/07 Javascript
JavaScript Eval 函数使用
2010/03/23 Javascript
js 自制滚动条的小例子
2013/03/16 Javascript
JS 修改URL参数(实现代码)
2013/07/08 Javascript
实例代码详解jquery.slides.js
2015/11/16 Javascript
深入学习AngularJS中数据的双向绑定机制
2016/03/04 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
JS实现的简单轮播图运动效果示例
2016/12/22 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
字太多用...代替的方法(两种)
2017/03/15 Javascript
详解vue.js全局组件和局部组件
2017/04/10 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
微信小程序实现列表下拉刷新上拉加载
2020/07/29 Javascript
vue 实现剪裁图片并上传服务器功能
2018/03/01 Javascript
微信小程序实现留言功能
2018/10/31 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
2019/06/17 Javascript
基于layui的table插件进行复选框联动功能的实现方法
2019/09/19 Javascript
微信小程序国际化探索实现(附源码地址)
2020/05/20 Javascript
Python Tkinter简单布局实例教程
2014/09/03 Python
Python 字符串与数字输出方法
2018/07/16 Python
python 调用钉钉机器人的方法
2019/02/20 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
Why do we need Unit test
2013/01/03 面试题
预备党员思想汇报
2014/01/08 职场文书
创建市级文明单位实施方案
2014/03/01 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
导游词之秦始皇兵马俑博物馆
2019/09/29 职场文书
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang
Python3 多线程(连接池)操作MySQL插入数据
2021/06/09 Python
在Java中Collection的一些常用方法总结
2021/06/13 Java/Android