observe 是一个深遍历函数,对嵌套对象进行劫持
track 是一个追踪函数,如果某些地方使用(get)到了该对象或对象的属性,就记录下来
trigger是一个触发函数,当修改了该对象,就执行track记录的东西。
function observe(data) {if(!data || typeof data !== 'object') returnfor(var key in data) {let val = data[key]Object.defineProperty(data, key, {enumerable: true,configurable: true,get: function() {track(data, key)return val},set: function(newVal) {trigger(data, key, newVal)val = newVal}})if(typeof val === 'object'){observe(val)}}}function track(data, key) {console.log('get data ', key)}function trigger(data, key, value) {console.log('set data', key, ":", value)}var data = {name: 'hunger',friends: [1, 2, 3]}observe(data)console.log(data.name)data.name = 'valley'data.friends[0] = 4data.friends[3] = 5 // 非响应式data.age = 6 //非响应式
