好久以前看过vue的一些原理,对其中的双向绑定原理也有必定程度上的了解,只是最近才在项目上使用vue,这才决定好好了解下vue的实现原理,所以这里对vue的双向绑定原理进行浅析,并作一个简单的实现。vue
vue双向绑定的原理浅析dom
vue数据的双向绑定是经过数据劫持,并结合发布-订阅模式的方式来实现的。mvvm
咱们先经过一个最简单的vue例子来查看vue初始化数据上的对象究竟是什么东西。函数
var vm = new Vue({ data: { // 双向绑定的数据对象 obj: { a: 1 } }, created: function () { // 初始化事件 console.log(this.obj); } });
经过控制台打印,咱们能够看到属性a有两个相对应的get方法和set方法,这两个方法的生成,是Object.defineProperty()方法来决定的。这样咱们就能够知道,vue是经过Object.defineProperty()方法来实现数据劫持,而后在其中的get方法和set方法作相应的操做来实现数据的双向绑定的。this
Object.defineProperty()方法的get和set属性spa
Object.defineProperty()方法能够用来控制一个对象的一些特有操做,好比读写权、是否能够枚举等,这里只简单分析它对应的两个描述属性get和set,这两个属性对应的属性值是函数。要了解这个方法的更多属性,能够参考MDN文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty。双向绑定
若是你开发过Java应用,很容易就能想到get方法和set方法是用来获取和设置对象的属性值的,同时还能经过在get方法和set方法中添加一些特定的代码来操做属性值,而在这里,状况其实并无什么不一样。顾名思义,get方法就是在读取对象的属性值的时候触发的事件函数,set方法啊就是在设置对象的属性值的时候触发的事件函数。code
简单实现对象
要实现mvvm的双向绑定是须要另外的一些操做的,好比发布-订阅模式的应用和dom操做等,这里只简单实现其中的数据劫持,对其余的原理不作深刻探讨。blog
var Person = {}; // 定义一个Person对象 var name = ''; // 定义一个name属性 // 给Person对象的name属性绑定get和set事件函数 Object.defineProperty(Person, 'name', { set: function (value) { name = value; console.log('我爱的人是' + value); }, get: function () { return '我爱' + name; } }) Person.name = 'yanggb'; // 我爱的人是yanggb console.log(Person.name); // 我爱yanggb
这样,咱们就在设置和读取Person对象的name属性的时候作了一些额外的加强操做,vue就是基于这种方法来进行对数据的劫持的。
"我仍是很喜欢你,像云在风中绵绵,不问所起。"