reflect也就是反射的意思,它的唯一作用就是可以完成对象的基本操作
什么是对象的基本操作?
我们JS里面有对象,函数也是对象,我们创建的对象也是对象,对于对象我们有很多的操作,比如说增删改查,obj.a=1,delete obj.a
等操作,我们还可以设置对象的原型,读取对象的原型,这些都是对对象的操作
我们无论是用语法来操作对象,还是用函数来操作对象,他们都在直接或间接的完成对象的基本操作
在ES-262的文档里面,他认为我们对一个对象一共就这些操作,这些操作无法被分割,这些就是基本操作,这些方法都是内部方法,不暴露在外的,这些操作是语言层面上规定好的,当时我们是无法直接使用这些基本操作的,至少在以前浏览器是不给我们使用的,我们只能间接的使用这些方法,比如说obj.a=1,使用的是[[set]]方法
一般情况下,使用间接方法是没有问题的,但是可能会导致无法预料的bug,比如说Object.keys,它会获取对象的可枚举的键对,如果我们给对象上添加一个不可枚举的值,他是拿不到的,当时如果我想想拿到这个值呢?就是用Reflect,它的作用就是调用对象的基本方法
我们像得到一个对象的所有key值,我们就可以使用Reflect.ownKeys获取到所有的键对
还有一个场景:
我们使用Reflect可以直接传递this,不需要浏览器给我们默认添加,我们这里也可以灵活性的修改this
在vue3的源码中,我们使用proxy来对对象进行代理,他有一个问题就是间接属性我们是拦截不到的因为它的this还是指向了原对象,而不是通过我们的proxy对象来读取的,所以我们proxy对象的get拦截不到其他的属性,如果我们使用Reflect.get(target,key,receiver)就可以拦截到了