本文实例讲述了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程序设计有所帮助。
更新动态
- 群星《唱给女人的歌》24K德国HD金碟[WAV+CUE]
- 孙燕姿.2011-是时候【美妙音乐】【WAV+CUE】
- 苏芮.2003-回首·时代全经典2CD【华纳】【WAV+CUE】
- 梁咏琪.1996-爱自己【EEI】【WAV+CUE】
- IGN经典逆天骚操作名著——《墙头草修炼手册》
- 突然爆火的“网红游戏”,真的有那么多人玩吗?
- 何老师客串《浪人崛起》了?盘点与明星撞脸的角色!
- 【原神】关于星鹫赤羽对珐芙琴班配队下珐露珊主C的适配度分析
- 【原神】V5.1攻略 | 迪西雅角色简评
- 【原神】大日御舆顶端怎么上去
- 胥拉齐《感谢有你》DTS-WAV
- 罗海英《金牌歌后》【WAV+CUE】
- 林叶《林叶·夜》【WAV/分轨】
- 群星《国语经典名曲01》音乐磁场系列[WAV+CUE][1G]
- 齐豫《滚石24K》24K金碟珍藏版系列[低速原抓WAV+分轨][1G]