Reflect的作用

Reflect是ES6新增的一个API,Reflect 是一个内置的对象,它提供很多 JavaScript 对象操作的方法。
类似于

1. Reflect.getPrototypeOf(target)类似于Object.getPrototypeOf( )
2. Reflect.defineProperty(target,propertyKey,attributes)类似于Object.defineProperty( )

我们的Object就可以做这些为什么还要用Reflect呢

  1. 早期设计没有考虑到这种对 对象本身的操作如何的设计,所以把这些全部放到了Object对象身上
  2. obj作为一个构造函数,这些操作并不合适,还有一些类似于 in操作符,delete操作符,让js更奇怪
  3. 所以 ES6中新增了Reflect,让我们这些操作都集中到了Reflect对象中。
  4. 可以用Reflect的方法获取到对象的值,从而避免直接操作对象。

与Proxy代理搭配使用
在使用Proxy的过程中我们通过Proxy代理对象,来进行对象的操作。
在proxy的方法中中我们通过Reflect 拿到对象的属性、值来进行操作

  1. get( ) :如果直接 return target[key] 这样做也是直接操作原来的对象,使用代理的原因不想直接操作Objcet,所以用Reflect的内部方法获取到值。
  2. set():通过 target[key] = newVal 来进行设置值,无法监听到有没有设置成功,如果对象的属性被冻结了就会设置失败。
  3. 通过 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

猜你喜欢

转载自blog.csdn.net/qq_43198727/article/details/129940268