1.什么是Proxy?Proxy对象用于拦截和修改目标对象的指定操作。//语法constp=newProxy(target,handler)target:目标对象(可以是任何类型的对象,包括原生数组、函数,甚至是另一个代理)。handler:以函数为属性的对象,实现拦截和自定义操作。2.如何使用?1.使用Proxy的简单实例访问不存在的属性,设置默认值return而不是undefined,gethandler有其特定的语法规则,看这里!//1.找到合适的处理程序并编写代码consthandler={get:function(obj,prop){returnpropinobj?对象[道具]:37;}};//2.新建Proxy对象constp=newProxy({},handler);//3.执行操作p.a=1;p.b=undefined;//4.查看结果console.log(p.a,p.b);//1,undefinedconsole.log('c'inp,p.c);//false,372.目标对象修改正确lettarget={};letp=newProxy(target,{});p.a=37;//操作被转发到目标console.log(target.a);//37.操作已经被正确转发3.使用sethandler数据校验的sethandler有其特定的语法规则,看这里!letvalidator={set:function(obj,prop,value){if(prop==='age'){if(!Number.isInteger(value)){thrownewTypeError('年龄不是整数');}if(value>200){thrownewRangeError('年龄似乎无效');}}//存储值的默认行为obj[prop]=value;//表示成功returntrue;}};letperson=newProxy({},validator);person.age=100;console.log(person.age);//100person.age='young';//抛出异常:UncaughtTypeError:Theageisnotanintegerperson.age=300;//抛出异常:UncaughtRangeError:Theageseemsinvalid4、扩展构造函数constructhandler的具体方法,看这里!base.prototype=Object.create(sup.prototype);varhandler={construct:function(target,args){varobj=Object.create(base.prototype);this.apply(目标,对象,参数);返回对象;},apply:function(target,that,args){sup.apply(that,args);base.apply(that,args);}};varproxy=newProxy(base,handler);descriptor.value=代理;Object.defineProperty(base.prototype,"constructor",descriptor);返回代理;}varPerson=function(name){this.name=name};varBoy=extend(Person,function(name,age){this.age=age;});Boy.prototype.sex="M";var彼得=新男孩(“彼得”,13岁);console.log(Peter.sex);//"M"console.log(Peter.name);//“彼得”console.log(Peter.age);//13三、参考文档详细解释JavaScript的Proxy对象
