ES2015 Reflect

112 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文同时参与 「掘力星计划」        ,赢取创作大礼包,挑战创作激励金

前言

Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与proxy handlers (en-US)的方法相同。Reflect不是一个函数对象,因此它是不可构造的。如果按照Java或者C#的说法,这个就是静态类。 所以new Reflect这样是不可以用的!

Reflect描述

与大多数全局对象不同Reflect并非一个构造函数,所以不能通过new运算符对其进行调用,或者将Reflect对象作为一个函数来调用。Reflect的所有属性和方法都是静态的(就像Math对象)。 仔细查看api会发现和Proxy的实现十分接近,其实Reflect就是proxy的默认实现

示例

let data = {
  name: ''
}
const proxy = new Proxy(data, {})

在我们不添加方法进去的时候,它内部的get/set是怎么样执行的呢? 当我们没有定义get方法的时候,就等同于

const proxy = new Proxy(data, {
    get(traget, property){
        return Reflect.get(traget, property)
    }
})

为什么要有Reflect

个人感觉主要是为了提供一套统一的用于操作对象的api

在这之前我们操作对象的方法一般就是用delete操作符或者Object的对象方法,下面有个例子:

let data = {
  name: ''
  age: 18
}
// 是否由对应的属性
console.log('name' in data)
// 删除属性值
console.log(delete data['age'])
// 获取对象全部key值
console.log(Object.keys(data))

使用 Reflect

let data = {
  name: ''
  age: 18
}
// 是否由对应的属性
console.log(Reflect.has(obj, 'name'))
// 删除属性值
console.log(Reflect.deleteProperty(obj, 'age'))
// 获取对象全部key值
console.log(Reflect.ownKeys(obj))