《javascript进阶:详解代理(Proxy)和反射(Reflect)》

46 阅读2分钟

一、前言

谈到js的Proxy和Reflect首先必须理解什么是js的属性描述符

这篇文章讲解的js属性描述符 juejin.cn/post/755068…

二、Reflect

2.1、什么是Reflect?

Reflect是一个内置的js对象,它提供了一系列的方法,可以让开发者通过调用这些方法访问一些js底层功能。

2.2、它可以做什么?

使用Reflect可以实现诸如属性的赋值、取值、调用普通函数、调用构造函数、判断属性是否存在对象中等等功能

2.3、js已经实现的功能为什么还需要用Reflect实现一次?

在语言编程中有一个重要的理念,在es5就被提出:减少魔法、让代码更加纯粹

这种理念很大程度上是受到函数式编程的影响

es6进一步贯彻了这种理念,它认为,对属性内存的控制、原型链的修改、函数调用等等这些都属于底层实现,属于魔法,因此需要将它们提取出来,形成一个正常的API,并高度聚合到某个对象中,于是就创造出来了Reflect对象。 因此,可以看到Reflect对象中有很多的API都可以使用过去的某种语法或者API实现

2.4、提供的API

  • Reflect.set(target,propertyKey,value) 设置对象target的属性propertyKey的值value,等同于给对象赋值
  • Reflect.get(target,propertyKey) 读取对象target的属性propertyKey的值,等同于读取对象的属性值
  • Reflect.apply(target,thisArgument,argumentsList) 调用一个指定函数,并绑定this和参数列表,等同于函数调用
  • Reflect.construct(target,argumentsList 用于构造函数创建一个对象,等于new关键值
  • Reflect.deleteProperty(target,propertyKey) 删除一个对象属性
  • Reflect.has(target,propertyKey) 判断一个对象是否拥有某个属性
  • 其他API:developer.mozilla.org/zh-CN/docs/…

三、Proxy

3.1、什么是Proxy代理?

就是给目标外面套一层壳、让所有与目标对象的交互都通过代理处理。 因此代理:需要提供修改底层实现的方式

3.2、语法

    //target:代理的对象
    //handler:对一个目标对象,其中可以重写底层实现(Reflect提供的API的所有都可以重写)
    new Proxy(target,handler)

比如给目标对象赋值

const obj = {
    test: " "
}
const objProxy = new Proxy(obj, {
    set(target,propertyKey,value){
        //target[propertyKey] = value
        //等于
        Reflect.set(target,propertyKey,value) //推荐这样写
    }
})