observe 是一个深遍历函数,对嵌套对象进行劫持
    track 是一个追踪函数,如果某些地方使用(get)到了该对象或对象的属性,就记录下来
    trigger是一个触发函数,当修改了该对象,就执行track记录的东西。

    1. function observe(data) {
    2. if(!data || typeof data !== 'object') return
    3. for(var key in data) {
    4. let val = data[key]
    5. Object.defineProperty(data, key, {
    6. enumerable: true,
    7. configurable: true,
    8. get: function() {
    9. track(data, key)
    10. return val
    11. },
    12. set: function(newVal) {
    13. trigger(data, key, newVal)
    14. val = newVal
    15. }
    16. })
    17. if(typeof val === 'object'){
    18. observe(val)
    19. }
    20. }
    21. }
    22. function track(data, key) {
    23. console.log('get data ', key)
    24. }
    25. function trigger(data, key, value) {
    26. console.log('set data', key, ":", value)
    27. }
    28. var data = {
    29. name: 'hunger',
    30. friends: [1, 2, 3]
    31. }
    32. observe(data)
    33. console.log(data.name)
    34. data.name = 'valley'
    35. data.friends[0] = 4
    36. data.friends[3] = 5 // 非响应式
    37. data.age = 6 //非响应式