Page 254 - 你不知道的JavaScript(下卷)
P. 254

要了解这里每个元编程任务的更多信息,参见 7.5 节。




                 除了上面列出的会触发各种 trap 的动作,某些 trap 是由其他 trap 的默认动作间接触发的。
                 比如:

                     var handlers = {
                             getOwnPropertyDescriptor(target,prop) {
                                 console.log(
                                     "getOwnPropertyDescriptor"
                                 );
                                 return Object.getOwnPropertyDescriptor(
                                     target, prop
                                 );
                             },
                             defineProperty(target,prop,desc){
                                 console.log( "defineProperty" );
                                 return Object.defineProperty(
                                     target, prop, desc
                                 );
                             }
                         },
                         proxy = new Proxy( {}, handlers );

                     proxy.a = 2;
                     // getOwnPropertyDescriptor
                     // defineProperty

                 getOwnPropertyDescriptor(..)  和 defineProperty(..) 处理函数是在设定属性值(不管是
                 新增的还是更新已有的)时由默认 set(..) 处理函数的步骤触发的。如果你也自定义了
                 set(..) 处理函数,那么在 context(不是 target !)上可以(也可以不)进行相应的调
                 用,这些调用会触发这些代理 trap。


                 7.4.1 代理局限性

                 可以在对象上执行的很广泛的一组基本操作都可以通过这些元编程处理函数 trap。但有一
                 些操作是无法(至少现在)拦截的。

                 比如,下面这些操作都不会 trap 并从代理 pobj 转发到目标 obj:
                     var obj = { a:1, b:2 },
                         handlers = { .. },
                         pobj = new Proxy( obj, handlers );

                     typeof obj;
                     String( obj );

                                                                               元编程   |   231

                                图灵社区会员 avilang(1985945885@qq.com) 专享 尊重版权
   249   250   251   252   253   254   255   256   257   258   259