ES6中Proxy与Reflect实现重载(overload)的方法

网友投稿 356 2023-05-27


ES6中Proxy与Reflect实现重载(overload)的方法

本文实例讲述了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 , receiverNcxcaAeS);

},

set: function(target, key, value, receiver){

console.log(`setting ${key}`);

return Reflect.set(target, key, value, receiver);

}

});

overload.m = 2; //sNcxcaAeSetting m

var s = overload.m; //getting m

看到了没,是不是很有意思,新创建的Proxy对象overload可以完成目标对象message的操作,同时,可以通过http://在默认操作之前自定义一些其他操作。我认为,这更像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程序设计有所帮助。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:ES6使用let命令更简单的实现块级作用域实例分析
下一篇:Java关键字this(动力节点Java学院整理)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~