Object.defineProperty
by jin5354
Babel + JSX
// more detail go to
// https://github.com/jin5354/leaf-observable
let o = {
a: 1
}
function watch(obj, key, callback) {
let value = obj[key]
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get() {
return value
},
set(newValue) {
if(newValue === value) {
return
}else {
let oldValue = value
value = newValue
callback(newValue, oldValue) // setter 中触发回调函数,并将新值与旧值作为参数传入
}
}
})
}
//『使数据响应化』和『添加回调函数』两个操作现在是耦合在一起的
watch(o, 'a', (newValue, oldValue) => { // 使 o.a 响应化
console.log('属性被修改了,新值为:', newValue, ',旧值为:', oldValue)
})
o.a = 2 // 输出: 属性被修改了,新值为: 2 ,旧值为: 1
o.a = 3 // 输出: 属性被修改了,新值为: 3 ,旧值为: 2