核心
-
通过Proxy(代理): 拦截对data任意属性的任意**(13种)操作**, 包括属性值的读写, 属性的添加, 属性的删除等...
-
通过 Reflect(反射): 动态对被代理对象的相应属性进行特定的操作 Reflect静态方法
-
Proxy Reflect正对出现,用于更改源对象
-
文档:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect
new Proxy(data, { // 拦截读取属性值 get (target, prop) { return Reflect.get(target, prop) }, // 拦截设置属性值或添加新属性 set (target, prop, value) { return Reflect.set(target, prop, value) }, // 拦截删除属性 deleteProperty (target, prop) { return Reflect.deleteProperty(target, prop) } }) proxy.name = 'tom' <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Proxy 与 Reflect</title> </head> <body> <script> const user = { name: "John", age: 12 }; /* proxyUser是代理对象, user是被代理对象 后面所有的操作都是通过代理对象来操作被代理对象内部属性 */ const proxyUser = new Proxy(user, { get(target, prop) { console.log('劫持get()', prop) return Reflect.get(target, prop) }, set(target, prop, val) { console.log('劫持set()', prop, val) return Reflect.set(target, prop, val); // (2) }, deleteProperty (target, prop) { console.log('劫持delete属性', prop) return Reflect.deleteProperty(target, prop) } }); // 读取属性值 console.log(proxyUser===user) console.log(proxyUser.name, proxyUser.age) // 设置属性值 proxyUser.name = 'bob' proxyUser.age = 13 console.log(user) // 添加属性 proxyUser.sex = '男' console.log(user) // 删除属性 delete proxyUser.sex console.log(user) </script> </body> </html>