Reflect是ES6新增的一个API,Reflect 是一个内置的对象,它提供很多 JavaScript 对象操作的方法。
类似于
1. Reflect.getPrototypeOf(target)类似于Object.getPrototypeOf( )
2. Reflect.defineProperty(target,propertyKey,attributes)类似于Object.defineProperty( )
我们的Object就可以做这些为什么还要用Reflect呢
- 早期设计没有考虑到这种对 对象本身的操作如何的设计,所以把这些全部放到了Object对象身上
- obj作为一个构造函数,这些操作并不合适,还有一些类似于 in操作符,delete操作符,让js更奇怪
- 所以 ES6中新增了Reflect,让我们这些操作都集中到了Reflect对象中。
- 可以用Reflect的方法获取到对象的值,从而避免直接操作对象。
与Proxy代理搭配使用
在使用Proxy的过程中我们通过Proxy代理对象,来进行对象的操作。
在proxy的方法中中我们通过Reflect 拿到对象的属性、值来进行操作。
- get( ) :如果直接 return target[key] 这样做也是直接操作原来的对象,使用代理的原因不想直接操作Objcet,所以用Reflect的内部方法获取到值。
- set():通过 target[key] = newVal 来进行设置值,无法监听到有没有设置成功,如果对象的属性被冻结了就会设置失败。
- 通过 Reflect.set(target, key, newVal, receiver) 设置值的时候,返回值是一个boolean类型 可以根据返回值来看是否成功。可以通过返回值来进行下一步操作
const obj = {
name: "韩程远",
age: 18
}
const objProxy = new Proxy(obj, {
get(target, key, receiver) {
console.log(`get-----------`)
//return target[key] // 这样做也是直接操作原来的对象,使用代理的原因不想直接操作Objcet
// 所以我们要用Reflect 在方法内部获取对象
// get 接收三个参数。第一个参数是 要对那个对象进行操作,第二个参数是获取对象里面的哪一个属性。
return Reflect.get(target, key)
},
set(target, key, newVal, receiver) {
//如果不是用捕获器,通过 target[key] = newVal 来进行设置
//无法监听到有没有设置成功,如果对象的属性被冻结了就会设置失败。
console.log(`set-----------`)
//Reflect.set(target, key, newVal, receiver) 设置值的时候,
//返回值是一个boolean类型 可以根据返回值来看是否成功
// 可以通过返回值来进行下一步操作
const result = Reflect.set(target, key, newVal, receiver)
if(result ){
}
}
})
objProxy.name = "han";
console.log(objProxy.name); // han
应用场景就是原来对Object操作全部换成Reflect