ES6-Proxy与Reflect 实现重载(overload)

JavaScript本身不支持重载,但通过ES6的Proxy和Reflect可以实现类似功能。Proxy用于修改默认行为,Reflect与其对应,共同帮助我们根据参数不同执行不同操作。文章列举了如get、set、construct等Proxy的拦截方法,介绍如何利用这些方法实现函数重载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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操作。

上面很多方法不是很常用,如果感兴趣可以去查查相关资料哦~



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值