vue 最基础的响应式实现
//拦截属性
function defineObj(obj) {
for (let key in obj) {
// 赋值
let tempValue = obj[key]
// 收集依赖的函数
let funcs = []
Object.defineProperty(obj, key, {
get: function () {
if (window.__func) {
funcs.push(window.__func)
}
return tempValue
},
set: function (val) {
tempValue = val
for (let i = 0; i < funcs.length; i++) {
funcs[i]()
}
},
})
}
}
// 收集依赖自动执行函数
function autoRunFunc(func) {
window.__func = func
func()
window.__func = null
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="/index.js"></script>
</head>
<body>
<div id="name"> </div>
<div id="age"> </div>
姓名:
<input type="text" oninput="obj.name = this.value">
<br />
年龄:
<input type="text" oninput="obj.age = this.value">
</body>
<script>
const obj = {
name: '凯德顺',
age: '20'
}
function showName (params) {
const nameDom = document.querySelector('#name')
nameDom.innerHTML = '姓名:' + obj.name
}
function showAge (params) {
const ageDom = document.querySelector('#age')
ageDom.innerHTML = '年龄:' + obj.age
}
defineObj(obj)
autoRunFunc(showName)
autoRunFunc(showAge)
</script>
</html>