Reflect 是一个内置对象,内部实现了Object内相关的方法,如defineProperty、getOwnPropertyDescriptor等方法,
作用:
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