- 实现原理:
- 对象类型:通过```Object.defineProperty()```对属性的读取、修改进行拦截(数据劫持)。
- 数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)。
模拟Vue2中实现响应式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=scr, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
let person = {
name: '张三',
age: 18
}
// 模拟Vue2中实现响应式
// #region
let p = {}
Object.defineProperty(p, 'name', {
get() {// 有人读取name时调用
return person.name
},
set(value) {// 有人修改name是调用
console.log('有人修改name属性,我发现了,我要去修改界面!');
return person.name = value;
}
})
Object.defineProperty(p, 'age', {
get() {// 有人读取 age 时调用
return person.age
},
set(value) {// 有人修改 age 是调用
console.log('有人修改 age 属性,我发现了,我要去修改界面!');
return person.age = value;
}
})
</script>
</body>
</html>
测试方法:在浏览器的控制台修改 p 的属性值,图示如下:
- 存在问题:
- 新增属性、删除属性, 界面不会更新。
- 直接通过下标修改数组, 界面不会自动更新。