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 相关文章推荐
JavaScript开发时的五个注意事项
Dec 08 Javascript
javascript中String类的subString()方法和slice()方法
May 24 Javascript
jquery实现树形二级菜单实例代码
Nov 20 Javascript
javascript正则表达式使用replace()替换手机号的方法
Jan 19 Javascript
基于 Node.js 实现前后端分离
Apr 23 Javascript
jQuery日程管理控件glDatePicker用法详解
Mar 29 jQuery
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
Aug 24 Javascript
Node.js事件的正确使用方法
Apr 05 Javascript
vue实现拖拽效果
Dec 23 Javascript
详解JS函数防抖
Jun 05 Javascript
详解ES6中class的实现原理
Oct 03 Javascript
quickjs 封装 JavaScript 沙箱详情
Nov 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 Framework基于Command命令行建立ZF项目的方法
2017/02/18 PHP
thinkphp5引入公共部分header、footer的方法详解
2018/09/14 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
基本DOM节点操作
2017/01/17 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
JavaScript防止全局变量污染的方法总结
2018/08/02 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
微信小程序收藏功能的实现代码
2020/06/19 Javascript
TypeScript 引用资源文件后提示找不到的异常处理技巧
2020/07/15 Javascript
小程序中手机号识别的示例
2020/12/14 Javascript
[02:12]DOTA2英雄基础教程 变体精灵
2013/12/16 DOTA
python读取csv文件示例(python操作csv)
2014/03/11 Python
Python爬虫模拟登录带验证码网站
2016/01/22 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
迪卡侬荷兰官网:Decathlon荷兰
2017/10/29 全球购物
Giglio俄罗斯奢侈品购物网:男士、女士、儿童高级时装
2018/07/27 全球购物
SKECHERS斯凯奇中国官网:来自美国的运动休闲品牌
2018/11/14 全球购物
安德玛加拿大官网:Under Armour加拿大
2019/10/02 全球购物
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
2014政务公开实施方案
2014/02/19 职场文书
校园活动策划方案
2014/06/13 职场文书
幼儿园班级工作总结2015
2015/05/25 职场文书
预备党员转正党小组意见
2015/06/01 职场文书
高中历史教学反思
2016/02/19 职场文书
创业计划书之面包店
2019/09/17 职场文书
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python
CPU不支持Windows11系统怎么办
2021/11/21 数码科技
MySQL实现配置主从复制项目实践
2022/03/31 MySQL
Python OpenCV之常用滤波器使用详解
2022/04/07 Python