Vue.js每天都在用(搬砖),今天深入下Vue原理。看了其他帖子之后,大致讲的都是数据劫持结合发布-订阅模式。
问题1:Vue中响应式怎么体现的
效果:当点击按钮时,name值由'zhangsan'变为'lisi'。Vue文档解释:当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data
选项,Vue 将遍历此对象所有的 property,并使用 Object.defineProperty
把这些 property 全部转为 getter/setter。
1、经过Object.defineProperty()处理之后,name属性变成了下面这样,包含了get和set 两个方法,当这个值被修改或者访问的时候,会执行提前定义好的函数
2、Object.defineProperty怎么实现劫持对象的访问或被修改的?
在Javascript中用于描述property的各种特征的内部属性,比如这个name属性能不能被删除、被枚举、被删除,如控制一个对象中的name属性不能被删除。用两个方括号[[ Configurable ]]来表示,这些内部属性不允许直接访问,只能通过Object.defineProperty方法来访问这些内部属性。
ECMAScript 中有两种属性:数据属性和访问器属性。
数据属性有 4 个描述其行为的特性。
- [[ Configurable ]]表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为 true。
- [[ Enumerable ]]表示能否通过 for-in 循环返回属性。像前面例子中那样直接在对象上定
义的属性,它们的这个特性默认值为 true。
- [[ writable ]]:表示能否修改属性的值。
[[ Value ]]: 属性值