源代码如下:
//1、第一步 将数据列入跟踪 应用Object.defineProperty() let defineReactive = function (data) { if(!data || typeof data != 'object') return Object.keys(data).forEach(key => { let value = data[key] defineReactive(value) //如果value还是对象,则对该对象递归持续应用defineReactive办法,实现深度绑定 Object.defineProperty(data, key, { //应用该办法监听对象属性的变动 enumerable: true, configurable: true, get: function () { console.log(value,'get method') return value }, set: function (newValue) { console.log(value,'set method') if (value === newValue) return value = newValue } }) }) } let obj = { a:3, b:5, c:{ c1:7 } } defineReactive(obj) // console.log(obj.a); console.log(obj.c.c1) //返回值为7,调用前输入7 "get method" // obj.a = 30 obj.c.c1 = 70 // 输入7 "set method" // console.log(obj.a); console.log(obj.c.c1) //返回值为70,调用前输入70 "get method"
能够看到,在批改或者调用obj对象的属性时,相应操作曾经被监听到并输入提示信息。此时咱们曾经实现对该对象的监听,并应用递归,在其属性值仍是对象时持续深刻监听。外围是应用Object.defineProperty来监听对象属性的获取和批改。