observe 是一个深遍历函数,对嵌套对象进行劫持
track 是一个追踪函数,如果某些地方使用(get)到了该对象或对象的属性,就记录下来
trigger是一个触发函数,当修改了该对象,就执行track记录的东西。
function observe(data) {
if(!data || typeof data !== 'object') return
for(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] = 4
data.friends[3] = 5 // 非响应式
data.age = 6 //非响应式