ES6语法Reflect的基本使用

上回说到了Proxy,接下来对Reflect做一些介绍。

学过其他语言的人看到 Reflect 这个词可能会首先联想到“反射”这个概念,但 JavaScript 由于语言特性是不需要反射的,所以这里的 Reflect 其实和反射无关,是 JavaScript 给 Proxy 配套的一系列函数。
Reflect 在 JS 环境里是一个全局对象,包含了与 Proxy 各种陷阱配套的函数。

Reflect 上的所有函数都对应一个 Proxy 的陷阱。这些函数接受的参数,返回值的类型,都和 Proxy 上的别无二致,可以说 Reflect 就是 Proxy 拦截的那些操作的原本实现。

Reflect不是一个函数对象,所以它是不可构造的,也就是说它不是一个构造器,不能通过 new 操作符去新建或者将其作为一个函数去调用 Reflect 对象。

Reflect的用法很简单,比如在不使用Reflect的情况下读取数据

1
2
let obj = {name : "lll"}
obj.name

使用Reflect

1
2
let obj = {name: "111"}
Reflect.get(obj, name)

这里说几个Reflect的陷阱,比如proxy中提到的deleteProperty和set:

语法:

1
Reflect.deleteProperty(target, propertyKey)

返回值是一个布尔值,表示操作成功与否。

不知道大家是否还记得,proxy中的deleteProperty陷阱就是需要返回一个布尔值,但是我们直接使用delete删除得到的并不是一个布尔值,所以我们可以在Proxy的陷阱中调用Reflect对应的api来完成操作并且能得到符合要求的返回值。

set方法也与之类似。

1
2
3
4
5
let handler = {
deleteProperty(...){
return Reflect.deleteProperty(...)
}
}

Reflect 里的函数都和 Proxy 的陷阱配套,返回值的类型也和 Proxy 要求的相同,所以如果我们要实现原本的功能,直接调用 Reflect 里对应的函数就好了。

Proxy和Reflect的get方法的配合更是无处不在,关于这一块还是单独拿出来写一篇,见下一章节吧。

作者

胡兆磊

发布于

2022-07-22

更新于

2022-10-23

许可协议