假设存在如下需求:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15let app1 = new Observer({
name: 'youngwind',
age: 25
});
let app2 = new Observer({
university: 'bupt',
major: 'computer'
});
// 要实现的结果如下:
app1.data.name // 你访问了 name
app1.data.age = 100; // 你设置了 age,新的值为100
app2.data.university // 你访问了 university
app2.data.major = 'science' // 你设置了 major,新的值为 science
这个功能的实现, 要用到 Object
中 setter
和 getter
的劫持。
结合着看过的对 Vue 的源码分析和自己理解的部分, 写一段简单的代码,功能并不完善。
一共分为 5 步来实现, 这里只实现第 1 步, 最简单的原理解释。
1 | class Observer { |
用题目要求的数据进行测试, 测试结果如下:1
2
3
4你访问了 name, 值为 youngwind
你设置了 age, 新的值为 100
你访问了 university, 值为 bupt
你设置了 major, 新的值为 science
示例可以点击这里进行查看。
程序很简单, 比较有意思的是作用域这一部分, 猜猜看, bind()
原型方法中会不会形成闭包?
答案: 会,因为 bind()
在执行的时候, 内部变量 Object.defineProperty
中定义的两个匿名函数被全局变量 app1
的 getter
和 setter
给分别引用了。