admin信息1: 管理员:张三 男
Error: 不能修改管理员姓名
at Object.set (/Users/stao2/www/learn/something/1.ts:18:15)
at Object.<anonymous> (/Users/stao2/www/learn/something/1.ts:29:14)
at Module._compile (node:internal/modules/cjs/loader:1254:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1308:10)
at Module.load (node:internal/modules/cjs/loader:1117:32)
at Module._load (node:internal/modules/cjs/loader:958:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:23:47
admin信息2: 管理员:张三 女
Proxy拦截对象的操作,这些操作有13种:get、set、apply等。
get、set
拦截对象的读取和赋值操作。如下场景,如果用户角色是管理员,那么期望在读取姓名的时候,补充上“管理员”角色名称,并且管理员的姓名不允许被修改。
利用这个规则,可以方便的给对象做一层扩展,而不用修改原来的对象逻辑。
apply
apply可以拦截函数的调用,对用户的年龄,但是对不同的角色,校验规则不一样,而且校验代码挺多,函数里的校验就耦合了。例如:
但是利用Proxy,可以这样做:
其他
Proxy还有
has
,construct
等拦截,先知道有这些东西,用的时候看文档用Proxy实现,而不是自己两眼一抹黑写了半天自己杂乱的代码。值得一提的是,很多MVVM框架是用Proxy做数据劫持的,例如Vue3,这样可以监听到对象的变化,从而实现响应式。