反射与代理

本文探讨了JavaScript中的反射和代理技术,包括它们在观察者模式中的应用、如何利用反射和代理实现偷懒的构造函数,以及如何确保函数参数的可验证性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

js中的反射与代理的应用

  • 观察者模式
    function obsetver(target){
        const proxy = new Proxy(target, {
            get(target, propertyKey){
                return Reflect.get(target, propertyKey)
            },
            set(target, propertyKey, value){
                target[propertyKey] = value;
            }
        })
        return proxy;
    }
    const target = {
        a : 1, 
        b : 2
    }
    const obj = obsetver(target);
    console.log( obj ); //Proxy {a: 1, b: 2}
    obj.c = 33;
    console.log( obj ); // Proxy {a: 1, b: 2, c: 33}
    console.log( target ); // {a: 1, b: 2, c: 33}
  • 偷懒的构造函数
    class User{
        // constructor(firstName, lastName, age){
        //     this.firstName = firstName;
        //     this.lastName = lastName;
        //     this.age = age;
        // }
    }
    function constructorProxy(Class, ...propNames){
       return new Proxy(Class, {
           construct(target, argumentsList){
              const obj = Reflect.construct(target, argumentsList);
              propNames.forEach((name, i) => {
                  obj[name] = argumentsList[i];
              })  
              return obj;
           }
       })
    }
    // const user = new User("宇","威", 23)
    const UserProxy = constructorProxy(User,"firstName", "lastName","age")
    const obj = new UserProxy("宇","威", 21);
    console.log(obj)
  • 可验证的函数参数
        function sun(a,b){
            return a + b;
        }
        function validatorFunction(func, ...types){
            return new Proxy(func,{
                apply(target, thisArgument, argumentsList){
                    // 判断看是否有类型不符
                    types.forEach( (t,i) => {
                        const arg = argumentsList[i];
                        if(typeof arg !== t){
                            throw new TypeError(`第${i + 1}个参数,不是${t}类型`);
                        }
                    } );
                    return Reflect.apply(target, thisArgument, argumentsList)
                }
                
            })
        }
        const func = validatorFunction(sun,"number","number");
        const aa = func(1,4);
        console.log( aa )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值