/**
* @desc 属性改变监听,属性被set时出发watch的方法,类似vue的watch
* @constructor
* @param {object} opts - 构造参数. @default {data:{},watch:{}};
* @argument {object} data - 要绑定的属性
* @argument {object} watch - 要监听的属性的回调
* watch @callback (newVal,oldVal) - 新值与旧值
*/
class watcher {
constructor(opts) {
this.$data = this.getBaseType(opts.data) === "Object" ? opts.data : {};
this.$watch = this.getBaseType(opts.watch) === "Object" ? opts.watch : {};
for (let key in opts.data) {
this.setData(key);
}
}
getBaseType(target) {
const typeStr = Object.prototype.toString.apply(target);
return typeStr.slice(8, -1);
}
setData(_key) {
Object.defineProperty(this, _key, {
get: function () {
console.log(this.$data)
return this.$data[_key];
},
set: function (val) {
console.log(this.$data)
const oldVal = this.$data[_key];
if (oldVal === val) return val;
this.$data[_key] = val;
this.$watch[_key] &&
typeof this.$watch[_key] === "function" &&
this.$watch[_key].call(this, val, oldVal);
return val;
},
});
}
}
// export default watcher;
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>wathc</title>
</head>
<body>
<script src="./watch.js"></script>
<script>
let wm = new watcher({
data:{
a: 0,
b: 'hello'
},
watch:{
a(newVal,oldVal){
console.log(newVal, oldVal); // 111 0
}
}
})
wm.a = 111
</script>
</body>
</html>
标签:val,watch,js,oldVal,key,data,监听,opts
From: https://www.cnblogs.com/echohye/p/16643157.html