深入响应式原理

         当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setterObject.defineProperty 是 ES5 中一个无法 shim 的特性,这也就是 Vue 不支持 IE8 以及更低版本浏览器的原因。

          这些 getter/setter 对用户来说是不可见的,但是在内部它们让 Vue 能够追踪依赖,在属性被访问和修改时通知变更。这里需要注意的是不同浏览器在控制台打印数据对象时对 getter/setter 的格式化并不同,所以建议安装  vue-devtools来获取对检查数据更加友好的用户界面。

          每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把“接触”过的数据属性记录为依赖。之后当依赖项的 setter 触发时,会通知 watcher,从而使它关联的组件重新渲染。

   现代JavaScript的限制object.observe也已经被弃用,vue无法检测到对象属性的添加和删除。由于vue初始化时对属性执行getter和setter转化,所以属性必须在data对象上存在才能让vue将他转化为响应式

的。

原文地址:https://www.cnblogs.com/PeiGaGa/p/10932720.html