源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-09-28 21:02 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:ES6中Proxy与Reflect实现重载(overload)的方法
本文实例讲述了ES6中Proxy与Reflect实现重载(overload)的方法。分享给大家供大家参考,具体如下: [b]Proxy与Reflect实现重载(overload)[/b] 从语法角度讲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.[code]get() [/code]用于拦截某个属性的读取操作。 2.[code]set()[/code] 用于拦截某个属性的赋值操作。 3.[code]has()[/code] 可以隐藏某些属性,不被in操作符遍历到。 4.[code]construct()[/code] 用于拦截new命令。 5.[code]deleteProperty()[/code] 用于拦截delete操作。 6.[code]defineProperty()[/code] 用于拦截Object.defineProperty操作。 7.[code]enumerate()[/code] 用于拦截for...in循环。 8.[code]getOwnPropertyDescriptor()[/code] 用于拦截Object.getOwnPropertyDescriptor操作。 9.[code]isExtensible()[/code] 用于拦截Object.isExtensible操作。 10.[code]preventExtensions()[/code] 用于拦截Object.preventExtensions操作。 11.[code]setPrototypeOf()[/code] 用于拦截Object.setPrototypeOf操作。 上面很多方法不是很常用,如果感兴趣可以去查查相关资料 希望本文所述对大家ECMAScript程序设计有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部