<!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>vue2响应式原理</title>
</head>
<body>
<script>
const data ={
name: 'wyh',
age: 22,
friend: {
friendName: '小夏'
},
colors: ['red', 'blue', 'green']
}
const oldArrayProto = Array.prototype;
const newArrProto = Object.create(oldArrayProto);
['push', 'pop', 'shift', 'unshift', 'splice'].forEach(methodName => {
newArrProto[methodName] = function () {
console.log('更新视图')
oldArrayProto[methodName].call(this, ...arguments);
}
})
console.log('oldArrayProto', oldArrayProto)
console.log('newArrProto', newArrProto)
observer(data);
function observer (target) {
if (typeof target !== 'object' || target === null) {
return target
}
if (Array.isArray(target)) {
target.__proto__ = newArrProto;
}
for (let key in target) {
defineReactive(target, key, target[key])
}
}
function defineReactive (target, key, value) {
observer(value);
Object.defineProperty(target, key, {
get() {
return value
},
set (newValue) {
observer(newValue);
if (newValue !== value) {
value = newValue
console.log('更新视图操作')
}
}
})
}
data.colors.push('gray')
console.log(data)
</script>
</body>
</html>