40 lines
1.1 KiB
JavaScript
40 lines
1.1 KiB
JavaScript
/**
|
||
* 设置监听器
|
||
*/
|
||
/**
|
||
* 设置监听器
|
||
*/
|
||
function setWatcher(data, watch) {
|
||
Object.keys(watch).forEach(v => {
|
||
let key = v.split('.'); // 将watch中的属性以'.'切分成数组
|
||
let nowData = data; // 将data赋值给nowData
|
||
for (let i = 0; i < key.length - 1; i++) { // 遍历key数组的元素,除了最后一个!
|
||
nowData = nowData[key[i]]; // 将nowData指向它的key属性对象
|
||
}
|
||
let lastKey = key[key.length - 1];
|
||
// 假设key==='my.name',此时nowData===data['my']===data.my,lastKey==='name'
|
||
observe(nowData, lastKey, watch[v]); // 监听nowData对象的lastKey
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 监听属性 并执行监听函数
|
||
*/
|
||
function observe(obj, key, watchFun) {
|
||
var val = obj[key]; // 给该属性设默认值
|
||
Object.defineProperty(obj, key, {
|
||
configurable: true,
|
||
enumerable: true,
|
||
set: function (value) {
|
||
val = value;
|
||
watchFun(value, val); // 赋值(set)时,调用对应函数
|
||
},
|
||
get: function () {
|
||
return val;
|
||
}
|
||
})
|
||
}
|
||
|
||
module.exports = {
|
||
setWatcher: setWatcher
|
||
} |