Proxy代理apply方法

介绍

apply方法拦截函数调用callapply操作
apply方法可接受三个参数,分别是
目标对象,目标对象的上下文对象(this),目标对象的参数数组

语法

{
            var handler = {
                apply(target,ctx,args) {
                    return Reflect.apply(...arguments);
                }
            }
        }

demo1 下面是一个例子

 {
            var target = function () {
                return 'I am the target';
            }
            var handler = {
                apply: function () {
                    return 'I am the proxy';
                }
            };
            var p = new Proxy(target,handler);
            console.log("p",p());
        }
//上面代码中,变量p是Proxy的实例,当他作为函数调用时(p())
//,就会被apply方法拦截,返回一个字符串

demo2 下面是另一个例子。

{
    var twice = {
                    //目标对象,目标对象的上下文对象,目标对象的参数数组
        apply:function (target,ctx,args) {
            //return console.log("target",target,"ctx",ctx,"args",args);
           return Reflect.apply(...arguments)*2;
        }
    };
    function sum (left,right) {
         return left*right;
    };
    var proxy = new Proxy(sum,twice);
    console.log("proxy1",proxy(1,2));
    console.log("proxy.call",proxy.call(null,5,6));
    console.log("proxy,apply",proxy.apply(null,[7,8]));
    console.log("proxy,apply",Reflect.apply(proxy,null,[7,8]));

}
//上面的实例执行顺序是当sum()执行完后再执行twice中的apply(),
//上面代码中每当执行proxy函数(直接调用或call和apply调用),就会被apply方法拦截
//另外,直接调用Reflect.apply方法,也会被拦截。

例子来源于阮一峰的es6入门,如果哪里写的不完整欢迎指正,还是萌新还望包容!

当然可以。JavaScript中的Proxy对象是ECMAScript 6中引入的一个新特性,它允许我们在访问一个对象之前,对这个对象进行拦截和修改。换句话说,Proxy对象是一个用于定义基本操作的对象,这些基本操作包括读取、写入、函数调用等。我们可以使用Proxy对象来创建一个拦截器,来捕获并处理操作,比如对属性进行访问、设置、删除等。 Proxy对象有两个参数:target和handler。target是要拦截的目标对象,handler是一个对象,用于定义拦截目标对象的各种操作。handler中定义了各种拦截器,用于拦截目标对象的不同操作,包括get、set、apply等。 以下是一个示例代码,说明如何使用Proxy对象: ``` let obj = { name: "John", age: 30 }; let handler = { get: function(target, prop) { if (prop === "age") { return target[prop] + " years old"; } else { return target[prop]; } }, set: function(target, prop, value) { if (prop === "age" && typeof value !== "number") { throw new TypeError("Age must be a number"); } else { target[prop] = value; } } }; let proxy = new Proxy(obj, handler); console.log(proxy.name); // Output: John console.log(proxy.age); // Output: 30 years old proxy.age = 35; console.log(proxy.age); // Output: 35 years old proxy.age = "35"; // Throws a TypeError: Age must be a number ``` 在这个例子中,我们定义了一个对象obj,然后创建了一个Proxy对象proxy,对obj对象进行拦截操作。handler对象中定义了get和set拦截器,用于在读取和设置obj对象的属性时进行拦截和处理。 当我们使用proxy.name来获取name属性时,get拦截器会被触发,它会返回obj对象中的name属性的值。而当我们使用proxy.age来获取age属性时,get拦截器也会被触发,但是它返回的是一个字符串,即obj对象中age属性的值加上" years old"。 当我们使用proxy.age = 35来设置age属性时,set拦截器会被触发,它会将35赋值给obj对象的age属性。而当我们使用proxy.age = "35"来设置age属性时,set拦截器也会被触发,但是它会抛出一个类型错误,因为age属性必须是一个数字。 总的来说,Proxy对象为JavaScript中的对象操作提供了更加灵活的拦截和处理方式,它可以用于实现一些高级功能,比如数据绑定、权限控制等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值