construct(target, argumentsList, newTarget):拦截 new 操作符。
1 2 3
proxy.name = "Alice"; // 输出: Setting name to Alice console.log(proxy.name); // 输出: Getting name: Alice console.log(proxy.age); // 输出: age 属性不存在
使用场景
数据验证
可以在 set 拦截器中添加验证逻辑,确保只有符合特定条件的数据才能被设置到对象中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
let validator = { set: function(obj, prop, value) { if (prop === 'age') { if (!Number.isInteger(value)) { thrownewTypeError('The age is not an integer'); } if (value > 200) { thrownewRangeError('The age seems invalid'); } } obj[prop] = value; } };
let person = newProxy({}, validator); person.age = 100; // 正常 person.age = 'young'; // 抛出 TypeError
日志记录
可以使用 get 和 set 拦截器记录对对象的访问和修改情况。
性能监控
通过代理对象的方法调用,可以记录每次调用的时间消耗,用于性能分析。
私有属性管理
通过代理隐藏或保护对象的某些属性,使其不能被外部直接访问或修改。
撤销对象引用
使用 Proxy.revocable() 方法可以安全地撤销对某个对象的引用。
1 2 3 4 5
let {proxy, revoke} = Proxy.revocable({}, {}); proxy.name = "Alice"; console.log(proxy.name); // 输出: Alice revoke(); // 撤销对 name 的引用 console.log(proxy.name); // 抛出 TypeError 错误