在我们学习 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 一旦大热,第一口螃蟹就真的不香了:)