ES6 Reflect 了解及使用

83 阅读1分钟

官网: MDNES6

Reflect 是一个内置对象,内部实现了Object内相关的方法,如definePropertygetOwnPropertyDescriptor等方法,

作用:

1.将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上。

2.修改某些Object方法的返回结果,让其变得更合理。比如,Object.defineProperty(obj, name, desc)在无法定义属性时,会抛出一个错误,而Reflect.defineProperty(obj, name, desc)则会返回false

3.让对象操作变成函数行为

let obj = { a: 1 }



delete obj.a
// 等价于
Reflect.deleteProperty(obj, 'a')

4.Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。

静态方法

Reflect对象一共有 13 个静态方法。

  • Reflect.apply(target, thisArg, args)
  • Reflect.construct(target, args)
  • Reflect.get(target, name, receiver)
  • Reflect.set(target, name, value, receiver)
  • Reflect.defineProperty(target, name, desc)
  • Reflect.deleteProperty(target, name)
  • Reflect.has(target, name)
  • Reflect.ownKeys(target)
  • Reflect.isExtensible(target)
  • Reflect.preventExtensions(target)
  • Reflect.getOwnPropertyDescriptor(target, name)
  • Reflect.getPrototypeOf(target)
  • Reflect.setPrototypeOf(target, prototype)

上面这些方法的作用,大部分与Object对象的同名方法的作用都是相同的,而且它与Proxy对象的方法是一一对应的。

Rroxy对象实现数据内容获取:

let obj = {
    a: 1
}

let newObj = new Proxy(obj, {
    get(target, key, receiver) {
        return Reflect.get(target, key)
    },
    set(target, key, value, receiver) {
        return Reflect.set(target, key, value)
    },
    has(target, key) {
        return Reflect.has(target, key)
    }
})

newObj.a = 100
newObj.a // 100

'a' in newObj // true