1. //用Proxy实现数据响应式(vue3.0),粘贴的
    2. let onWatch = (obj, setBind, getLogger) => {
    3. let handler = {
    4. get(target, property, receiver) {
    5. getLogger(target, property)
    6. // 这句判断代码是新增的,这里体现了Proxy不用一层层递归去为每个属性添加代理,性能上更优
    7. //vue3.0中使用了Proxy替代了原来的Object.defineProperty
    8. if (typeof target[property] === 'object' && target[property] !== null) {
    9. return new Proxy(target[property], handler);
    10. } else {
    11. return Reflect.get(target, property);
    12. }
    13. },
    14. set(target, property, value, receiver) {
    15. setBind(value, property)
    16. return Reflect.set(target, property, value)
    17. }
    18. }
    19. return new Proxy(obj, handler)
    20. }
    21. let obj = { a: 1 }
    22. let p = onWatch(
    23. obj,
    24. (v, property) => {
    25. console.log(`监听到属性${property}改变为${v}`)
    26. },
    27. (target, property) => {
    28. console.log(`'${property}' = ${target[property]}`)
    29. }
    30. )
    31. p.a = 2 // 监听到属性a改变
    32. p.a // 'a' = 2