Reflection 基础知识(二)

发布时间:2022-06-27 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Reflection 基础知识(二)脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

Proxy 定义

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

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

Proxy.revocable()方法

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

示例如下:

Reflection 基础知识(二)

handler对象

Reflection 基础知识(二)

handler get

拦截对象属性值的获取。

get(target, property, receiver)

Reflection 基础知识(二)

handler set

拦截对象属性值的设置。

set(target, property, value, receiver)

 

Reflection 基础知识(二)

handler deleteProperty

拦截对象属性的删除

deleteProperty(target, property)

Reflection 基础知识(二)

handler getOwnPropertyDescriptor

拦截获取对象属性描述。

getOwnPropertyDescriptor(target,property)

Reflection 基础知识(二)

handler defineProperty

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

defineProperty(target,property,descriptor)

Reflection 基础知识(二)

handler has

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

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

has(target,property)

 

Reflection 基础知识(二)

 

handler ownKeys

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

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

 

Reflection 基础知识(二)

 

handler apply

拦截函数调用

apply(target,ctx,args)

 

Reflection 基础知识(二)

 

handler construct

拦截构造函数调用。

construct(target,args)

Reflection 基础知识(二)

handler getPrototypeOf

拦截获取对象的原型

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

Reflection 基础知识(二)

handler setPrototypeOf

拦截设置对象的原型。

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

Reflection 基础知识(二)

handler isExtensible

拦截判断对象是否可扩展

isExtensible(target)

handler preventExtensions

拦截对象的组织扩展方法

preventExtensions(target)

Reflection 基础知识(二)

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

实际应用

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

let obj = {
  id: 100,
  say: function () {
    console.log('say exec');
    return 'xxx'
  }
}

let handler = {
  get: function (target, property, receiver) {
    let value = Reflect.get(target, property, receiver)
    if (typeof value === 'function') {
      return function (...rest) {
        console.log(`before ${property} exec.`);
        let res = Reflect.apply(value, target, rest);
        console.log(`after ${property} exec.`);
        return res;
      }
    } else {
      return value;
    }
  },
}
let proxy = new Proxy(obj, handler);
proxy.id
proxy.say()

Reflection 基础知识(二)

脚本宝典总结

以上是脚本宝典为你收集整理的Reflection 基础知识(二)全部内容,希望文章能够帮你解决Reflection 基础知识(二)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: