vue如何实现响应式

2020-08-01  本文已影响0人  泡杯感冒灵

什么是响应式

Object.defineProperty

var obj = {
  name: 'zhangsan',
  age:20
}
console.log(obj.name)  //  zhangsan 获取属性的时候,是无法监听的
obj.age = 25   // 赋值属性的时候,是无法监听的
var obj = {}
var _name = 'lisi'  // 下划线,是一种常用的记号,表示只能通过对象的方法访问的属性

Object.defineProperty(obj, 'name', {
  get: function () {
    console.log('get')  // 监听
    return _name
  },
  set: function (newValue) {
    console.log('set') // 监听
    _name = newValue
  }
})

console.log(obj.name)  // lisi  当我们在这里访问name属性的时候,后台打印了get,说明我们监听到了get函数被调用了,也就是属性的获取被监听到了
obj.name = 'wangwu'   // 这一步是给name赋了一个新值,控制台打印了set,说明我们监听到了set函数被调用了,也就是属性的修改被监听到了
image.png

要想实现vue中的响应式,有两个问题我们要弄明白

// vm是一个vue实例
// var vm = new Vue({
//   el:'#app',
//   data:{
//     name:'lisi',
//     age: 20
//   }
// })

// 我们可以模拟一下,vue是怎么监听name和age的变化的,以及name和age怎么代理到vm实例上的
var vm = {}
var data = {
  name: 'lisi',
  age:20
}

var key, value
for (key in data) {
  // 此时key会命中一个闭包,我们需要一个立即执行函数把每个循环到的key保留下来
  (function (key) {
    Object.defineProperty(vm, key, {
      get: function () {
        console.log('get',data[key])  // 监听
        return data[key]
      },
      set: function (newVal) {
        console.log('set',newVal)    // 监听
        data[key] = newVal
      }
    })
  })(key)
}

总结,关于vue的响应式怎么理解的回答,主要两点

上一篇 下一篇

猜你喜欢

热点阅读