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) 专享 尊重版权