反射和代理

本文详细介绍了JavaScript中的Reflect对象及其常用方法,如set、get、apply、defineProperty等,展示了如何利用它们进行底层操作。同时,探讨了代理(Proxy)对象的创建及应用场景,通过set和get方法实现属性访问控制,以及如何利用Proxy实现自定义行为。通过实例代码加深了理解。
摘要由CSDN通过智能技术生成

反射:

        1.Reflect概念:是属于js内置对象,它可以提供一系列的方法,开发者能调用这些方法,访问js底层的相应功能。

        2.作用:使用Reflect 能够实现函数的调用,对象的取值赋值以及属性是否存在等一系列的底层方法和功能。

        3.整体思想:减少语法,使代码更加纯粹,受到函数式编程思想的影响,减少符号的使用,将所有方法都封装在函数中,让这些函数高度集中在一个对象上面,这个对象就是Reflect

        4.Reflect方法(API)

            4.1  Reflect.set(target,protertyKey,value)

            4.2  Reflect.get(target,protertyKey)

            set和get方法小应用可以看下面的简单示例代码

 <script>
        const obj1 = {
            a : 1,
            b : 2
        }
        // 反射中的API
        // 4.1 set
           Reflect.set(obj1,"c",3)
           console.log(obj1)
        // 4.2 get
           console.log(Reflect.get(obj1,"b"))
 </script>

           4.3  Reflect.apply(target,this,arguments)                函数调用,顺便改变this指向

<script>
         function fun(a,b){
             console.log(this);
             return a + b;
         }
         fun(3,4);
         Reflect.apply(fun,null,[3,4]);
         Reflect.apply(fun,obj1,[3,4]);
</script>

           4.4  Reflect.defineProperty(target,protertyKey)         类似于Object,不同的是Reflect如果配置出现错误的话,会返回false而不是报错。

<script>
     const obj1 = {
            a : 1,
            b : 2
     }
     Reflect.defineProperty(obj1,'a',{
             value : 10,
             configurable : false,
             enumerable : false,
             writable : false
         })
     console.log(obj1)
</script>

             4.5   Reflect.construct(target,arguments)        使用构造函数的方式创建对象

<script>
       function Test(a,b){
            this.a = a;
            this.b = b;
        }
        const t = Reflect.construct(Test,[5,6])
        console.log(t)
</script>

             4.6  Reflect.has(target,protertyKey)        判断一个对象是否拥有一个属性

代理:

代理提供了修改底层实现的方式,没有自己的原型对象

创建方式:

        const    p  =   new   Proxy(target,handler)

        p:就是返回的代理对象

        target: 是指被代理的对象

        handler:是一个普通对象,里面可以配置底层方法

示例代码

    <script>
        const obj = {
            a : 1,
            b : 2
        }
        const proxy = new Proxy(obj,{
            set(target,protertyKey,value){
                Reflect.set(target.protertyKey,value+10)
            },
            get(target,protertyKey){
                return  Reflect.get(target,protertyKey)
            },
            has(){

            },
            deleteProperty(target,protertyKey){
                Reflect.deleteProperty(target,protertyKey)
            },
            defineProperty(){

            }
        })
        console.log(proxy);
        proxy.a = 10;
        console.log(obj);
        console.log(proxy);
    </script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值