在生活中,通过代理我们可以自动屏蔽小红的邀请、自动赶走二虎的威胁、自动买好干净的饭端到床上。在JavaScript世界里,代理也可以帮你做类似的事情,接下来让我们一起琢磨一番。
什么是代理?
让我们看三个案例:
A:上小学的时候,李小红来你家叫你出去玩,第一个回应的不是你自己,是你妈:“王小明在家写作业,今天不出去!”
B:上中学的时候,赵二虎带着小弟们放学在校门口等着揍你,走在前面的不是你自己,是二虎他爸:“考试没及格还学会装黑社会了!”拎起二虎就是一顿胖揍。
C:上了大学,躺在宿舍里的床上,好饿。出门买饭并交代好不要葱蒜多放辣最后还直接端到床上的不是你自己,是快递小哥。
这些都是代理。
什么是JavaScript代理?
用官方的洋文来说,是Proxy:
TheProxyobjectisusedtodefinecustombehaviorforfundamentaloperations(e.g.propertylookup,assignment,enumeration,functioninvocation,etc).
通过Proxy我们可以拦截并改变一个对象的几乎所有的根本操作,包括但不限于属性查找、赋值、枚举、函数调用等等。
初识代理:HelloWorld
以小学经历为例子,心里是喜欢小红的,于是我们定义:
constme={name:'小明',like:'小红'}
这个时候如果调用console.log(me.like),结果必然是小红。然而生活并不是这样,作为一个未成年人,总是有各种的代理人围绕在你身边,比如这样:
constmeWithProxy=newProxy(me,{
get(target,prop){
if(prop==='like'){
return'学习';
}
returntarget[prop];
}
});
总之,代理就是这个时候如果调用console.log(me.like)依然是小红,因为真心不会说谎。但当我们调用console.log(meWithProxy.like)的时候,就会可耻的输出学习,告诉大家说我们喜欢的是学习。