console
function updateView() {
console.log('更新视图');
}
const oldArrayProperty = Array.prototype
const arrProto = Object.create(oldArrayProperty);
['push', 'pop', 'shift', 'unshift', 'splice'].forEach(methodName => {
arrProto[methodName] = function () {
updateView()
oldArrayProperty[methodName].call(this, ...arguments)
}
})
function defineReactive(target, key, value) {
observe(value)
Object.defineProperty(target, key, {
get() {
return value
},
set(newVal) {
if (newVal !== value) {
observe(newVal)
value = newVal
updateView()
}
}
})
}
function observe(target) {
if (typeof target !== 'object' || target === null) {
return target
}
if (Array.isArray(target)) {
target.__proto__ = arrProto
}
for (let key in target) {
defineReactive(target, key, target[key])
}
}
const data = {
name: 'zhangsan',
age: 20,
info: {
address: 'GZ'
},
nums: [1, 2, 3]
}
observe(data)
data.name = "jack"
data.age = { num: 1 }
data.info.address = 'SH'
data.nums.push(4)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Observe demo</title>
</head>
<body>
<p>响应式 demo</p>
<script src="./observe.js"></script>
</body>
</html>