MySQL 系统学习 第四阶段:MySQL 高级 第二节:EXPLAIN 执行计划
2026/7/14 5:26:19
Proxy 就像一个“拦截器”,它可以“监听”一个对象的操作,比如:
get拦截器set拦截器get),再执行它set(key, value)方法add(value)方法get(key)或 Set 的has(value)方法所以,我们想拦截“写入”操作,就要拦截这些方法的调用。
proxyMap.set,会触发 Proxy 的get拦截器,告诉你访问了set方法。set方法。constmap=newMap();consthandler={get(target,prop,receiver){// 访问属性或方法时触发constorigMethod=target[prop];if(typeoforigMethod==='function'){// 如果访问的是方法,返回一个包装函数returnfunction(...args){if(prop==='set'){console.log(`写入操作:set(${args[0]},${args[1]})`);}elseif(prop==='get'){console.log(`读取操作:get(${args[0]})`);}// 调用原始方法returnorigMethod.apply(target,args);};}// 访问普通属性,直接返回returnReflect.get(target,prop,receiver);}};constproxyMap=newProxy(map,handler);proxyMap.set('name','CodeMoss');// 控制台输出:写入操作:set(name, CodeMoss)console.log(proxyMap.get('name'));// 控制台输出:读取操作:get(name)// 输出:CodeMossproxyMap.set→ Proxy 拦截,返回一个“带日志”的函数map.setadd,读取方法叫hasconstset=newSet();consthandler={get(target,prop,receiver){constorigMethod=target[prop];if(typeoforigMethod==='function'){returnfunction(...args){if(prop==='add'){console.log(`写入操作:add(${args[0]})`);}elseif(prop==='has'){console.log(`读取操作:has(${args[0]})`);}returnorigMethod.apply(target,args);};}returnReflect.get(target,prop,receiver);}};constproxySet=newProxy(set,handler);proxySet.add(123);// 控制台输出:写入操作:add(123)console.log(proxySet.has(123));// 控制台输出:读取操作:has(123)// 输出:trueconstweakMap=newWeakMap();consthandler={get(target,prop,receiver){constorigMethod=target[prop];if(typeoforigMethod==='function'){returnfunction(...args){if(prop==='set'){console.log('WeakMap 写入操作,键:',args[0],'值:',args[1]);}elseif(prop==='get'){console.log('WeakMap 读取操作,键:',args[0]);}returnorigMethod.apply(target,args);};}returnReflect.get(target,prop,receiver);}};constproxyWeakMap=newProxy(weakMap,handler);constobjKey={};proxyWeakMap.set(objKey,'secret');// 控制台输出:WeakMap 写入操作,键: {} 值: secretconsole.log(proxyWeakMap.get(objKey));// 控制台输出:WeakMap 读取操作,键: {}// 输出:secretget拦截器拦截的是“属性访问”,方法调用是先访问方法再执行。把 const objKey = {}; 换成 map”,把 WeakMap 的键从一个普通对象{}换成一个 Map 对象。
WeakMap 的键必须是对象,而 Map 本身是一个对象(它是一个构造函数实例),所以理论上是可以作为 WeakMap 的键的。
constweakMap=newWeakMap();consthandler={get(target,prop,receiver){constorigMethod=target[prop];if(typeoforigMethod==='function'){returnfunction(...args){if(prop==='set'){console.log('WeakMap 写入操作,键:',args[0],'值:',args[1]);}elseif(prop==='get'){console.log('WeakMap 读取操作,键:',args[0]);}returnorigMethod.apply(target,args);};}returnReflect.get(target,prop,receiver);}};constproxyWeakMap=newProxy(weakMap,handler);// 这里用 Map 作为键constmapKey=newMap();proxyWeakMap.set(mapKey,'secret');// 控制台输出:WeakMap 写入操作,键: Map {} 值: secretconsole.log(proxyWeakMap.get(mapKey));// 控制台输出:WeakMap 读取操作,键: Map {}// 输出:secretmapKey是一个 Map 实例,属于对象类型,可以作为 WeakMap 的键。