今天我们将尝试下花1分钟的时间简单地了解下什么是JS代理对象(proxies)?我们可以这样理解,JS代理就相当于在对象的外层加了一层拦截,在拦截方法里我们可以自定义一些个性化的逻辑,定义完后我们可以通过代理定义的方法间接操作对象。再说得通俗点,在我们的生活中,我们买房租房一般不找房东先找中介的道理一样,因为中介充当了房源的代理一样。 接下来我们通过代码理解下什么是代理,用JS创建代理比较简单,如下段代码所示:letinitialObject{定义对象};lethandler{自定义相关的拦截器处理逻辑};letproxyedObjectnewProxy(initialObject,handler); 简单解释下,我们可以通过代理去调用handler里定义的逻辑去操作对象,对象代理有两个参数,initialObject是目标对象,handler拦截器对象(或者称作处理器对象)。 接下来,我们来看一个例子,我们通过代理实现读取一个对象的属性,如果对象的属性不存在,则返回代理中定义的默认值,这里我们在代理里重写了原有对象的get方法。letdog{name:Spike};consthandler{get:(obj,property)propertyinobj?obj〔property〕:Youdonthavedefinedapropertynamedproperty;}constproxyDognewProxy(dog,handler);console。log(proxyDog。name);将会输出Spikeconsole。log(proxyDog。age);输出Youdonthavedefinedapropertynamedage 上述例子,我们通过get:(obj,property)。。。方法重写了对象的get方法。 最后我再看一个如何通过代理去更对对象的值,如果更新的值不是我们期望的值,系统则抛出异常错误,不能正常更新,否则重新赋值并更新对象的属性。letdog{name:Spike,age:1;};lethandler{set:(obj,property,value){if(propertyage){if(!Number。isInteger(value))thrownewTypeError(Usenumbersonlyforage);if((value0)(value30))thrownewRangeError(Adogcantlivethatlong);}obj〔prop〕value;returntrue;}};constproxyDognewProxy(dog,handler);proxyDog。age1;willthrowAdogcantlivethatlongproxyDog。ageveryold;willthrowUsenumbersonlyforage 通过JS代理我们不仅可以重写getters和setters方法,我们还可以进行这些操作:deleteProperty、construct、getOwnPropertyDescriptor等。。。 今天的文章就到这里,不知道你是否理解代理对象啦,在接下来的文章里,我们再聊聊代理在实际项目中的运用,感谢你的阅读。参考来源:http:www。jscraft。ioblogwhatarejavascriptproxies Daniel