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

•  如果一个对象通过 Object.defineProperty(..) 重新配置这个对象的属性,比如修改
                 它的 writable 属性,就会发出 "reconfigure" 改变事件。参见本系列《你不知道的
                 JavaScript(上卷)》第二部分可以获取更多信息;
               •  如果一个对象通过 Object.preventExtensions(..) 变为不可扩展,就会发出 "prevent
                 Extensions" 改变事件。

               因为 Object.seal(..) 和 Object.freeze(..) 也都意味着 Object.preventExtensions(..),
               所以它们也会发出相应的改变事件。另外,   对象的每个属性都会发出 "reconfigure" 改变
               事件。如果一个对象的 [[Prototype]] 改变,或者通过 __proto__ setter 来设置,或者使用
               Object.setPrototy peOf(..) 来设置,都会发出 "setPrototype" 改变事件。

               注意,这些改变事件会在改变发生后立即发出。不要把这一点和代理混淆(参见第 7 章),
               代理是可以在动作发生之前拦截的。对象观察支持在变化(或一组变化)发生后响应。


               8.2.1 自定义改变事件

               除了前面 6 类内置改变事件,你也可以侦听和发出自定义改变事件。

               考虑:
                   function observer(changes){
                       for (var change of changes) {
                           if (change.type == "recalc") {
                               change.object.c =
                                   change.object.oldValue +
                                   change.object.a +
                                   change.object.b;
                           }
                       }
                   }

                   function changeObj(a,b) {
                       var notifier = Object.getNotifier( obj );
                       obj.a = a * 2;
                       obj.b = b * 3;

                       // 把改变事件排到一个集合中
                       notifier.notify( {
                           type: "recalc",
                           name: "c",
                           oldValue: obj.c
                       } );
                   }

                   var obj = { a: 1, b: 2, c: 3 };

                   Object.observe(
                       obj,



               258   |   第 8 章
                                图灵社区会员 avilang(1985945885@qq.com) 专享 尊重版权
   276   277   278   279   280   281   282   283   284   285   286