欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-15 11:05:18
本文实例讲述了es6中proxy与reflect实现重载(overload)的方法。分享给大家供大家参考,具体如下: 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 , 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程序设计有所帮助。