经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
Reflection 基础知识(二)
来源:cnblogs  作者:只做你的向日葵  时间:2021/12/31 23:32:15  对本文有异议

Proxy 定义

Proxy用于修改对象的某些行为,获取值,设置值等

  1. let p = new Proxy(target, handler);
  • target 用Proxy包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。
  • 一个对象,其属性是当执行一个操作时定义代理的行为的函数。

Proxy.revocable()方法

  1. let {proxy,revocable} = Proxy.revocable(target, handler);
  • target,handler参数和new Proxy()一致。
  • revoke()方法调用后,代理会变为无效状态。

示例如下:

handler对象

handler get

拦截对象属性值的获取。

  1. get(target, property, receiver)

handler set

拦截对象属性值的设置。

  1. set(target, property, value, receiver)

 

handler deleteProperty

拦截对象属性的删除

  1. deletePropertytarget, property

handler getOwnPropertyDescriptor

拦截获取对象属性描述。

  1. getOwnPropertyDescriptor(target,property)

handler defineProperty

拦截定义对象属性的描述。

  1. defineProperty(target,property,descriptor)

handler has

拦截判断对象属性是否存在

包括property in proxy 和 Reflect.has , 不包括Object.prototype.hasOwnProperty。

  1. has(target,property)

 

 

handler ownKeys

拦截对象自身属性key值的读取操作,返回字符串或Symbol值数组。

  • Object.getOwnPropertyNames()
  • Object..getOwnPropertySymbols()
  • Object.keys()
  • for...in循环
  1. ownKeys(target)

 

 

handler apply

拦截函数调用

  1. apply(target,ctx,args)

 

 

handler construct

拦截构造函数调用。

  1. construct(target,args)

handler getPrototypeOf

拦截获取对象的原型

  • Object.prototype.__proto__
  • Object.prototype.isPrototypeOf()
  • Object.getPrototypeOf()
  • Reflect.getPrototypeOf()
  • instanceof
  1. getPrototypeOf(target)

handler setPrototypeOf

拦截设置对象的原型。

  • Object.prototype.__proto__
  • Object.setPrototypeOf()
  • Reflect.setPrototypeOf()
  1. setPrototypeOf(target,proto)

handler isExtensible

拦截判断对象是否可扩展

  1. isExtensible(target)

handler preventExtensions

拦截对象的组织扩展方法

  1. preventExtensions(target)

更多关于handler规范,请参考es2015规范的26.2.2章节。

实际应用

监听某个对象,在执行该对象的所有函数时,打印执行前后的日志。

  1. let obj = {
  2. id: 100,
  3. say: function () {
  4. console.log('say exec');
  5. return 'xxx'
  6. }
  7. }
  8. let handler = {
  9. get: function (target, property, receiver) {
  10. let value = Reflect.get(target, property, receiver)
  11. if (typeof value === 'function') {
  12. return function (...rest) {
  13. console.log(`before ${property} exec.`);
  14. let res = Reflect.apply(value, target, rest);
  15. console.log(`after ${property} exec.`);
  16. return res;
  17. }
  18. } else {
  19. return value;
  20. }
  21. },
  22. }
  23. let proxy = new Proxy(obj, handler);
  24. proxy.id
  25. proxy.say()

原文链接:http://www.cnblogs.com/likme/p/15754486.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号