API 终结者 —— 杀手 Reflect

460 阅读2分钟

在我们学习 JavaScript 过程中,操作繁琐的 API 令人头秃。

以 Object 为例,ES5 中提出的 Object.defineProperty() 是用来定义对象属性 API 的,它的用法也很明确。

而在 ES6+ 中提出的 Proxy 也发挥了同样的作用,甚至比前者做得更好。这就让切图仔们痛苦不已。同样,这些问题在前端面试中也是常常被问到的。

因此,Reflect 顺势而生。它给开发者提供了一套统一的操作对象的 API。这让对象操作终于有了一套自己的官方标准,不再“因人而异”了。与此同时,它也给大家带来了一些学习成本。话不多说,我们先来刷几个 API。

Reflect 静态方法 apply()

var obj = {}
    function fn(q,r){
        console.log(q,r) //"as",23
        console.log("111",this) // {}
        return "hello world"
    }

       let a = Reflect.apply(fn,obj,["as",23])
    console.log(a) // hello world

根据上面的代码,fn 就是我们的目标函数 target ,obj 就是替换 target 中 this 的对象,["as",23] 里的元素就是 target 中的参数集。用法跟 Function.apply() 的用法一致。

Reflect 静态方法 ownKeys()

let obj = {
    name:"xx",
    age:"27",
    sex:1
}
let arr = Reflect.ownKeys(obj)
console.log(arr) // ['name','age','key']

同样,从结果就能看出 ownKeys() 将目标对象中的所有属性都提取成一个单独的数组。

至于剩下的 API 建议大家去 MDN 上刷一遍。

刷完 API 后大家可以发现,对于对象的操作,用法上非常统一。不管是读取、删除,还是判断,Reflect 一律换成了 Reflect.api() 的这种结构。这样一改,瞬间就把之前乱七八糟的用法进行了管理和约定上的统一。

对于新手而言,这真是一个好消息。偷偷告诉大家,EcmaScript 也有意向要摒弃掉之前的 API, 虽然现在还给予保留,劝告小伙伴们,抓紧熟悉 Reflect,否则 Reflect 一旦大热,第一口螃蟹就真的不香了:)