Object.defineProperty()如何使用

213 阅读2分钟

Vue.js每天都在用(搬砖),今天深入下Vue原理。看了其他帖子之后,大致讲的都是数据劫持结合发布-订阅模式。

问题1:Vue中响应式怎么体现的


效果:当点击按钮时,name值由'zhangsan'变为'lisi'。Vue文档解释:当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的 property,并使用 Object.defineProperty 把这些 property 全部转为 getter/setter

1、经过Object.defineProperty()处理之后,name属性变成了下面这样,包含了getset 两个方法,当这个值被修改或者访问的时候,会执行提前定义好的函数


2、Object.defineProperty怎么实现劫持对象的访问或被修改的?

在Javascript中用于描述property的各种特征的内部属性,比如这个name属性能不能被删除、被枚举、被删除,如控制一个对象中的name属性不能被删除。用两个方括号[[ Configurable ]]来表示,这些内部属性不允许直接访问,只能通过Object.defineProperty方法来访问这些内部属性。

ECMAScript 中有两种属性:数据属性和访问器属性。

数据属性有 4 个描述其行为的特性。 

  • [[ Configurable ]]表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为 true。 


  • [[ Enumerable ]]表示能否通过 for-in 循环返回属性。像前面例子中那样直接在对象上定

    义的属性,它们的这个特性默认值为 true。


  • [[ writable ]]:表示能否修改属性的值。


  • [[ Value ]]: 属性值

访问器属性包含getter 和 setter 函数


 总结:如果想在数据变化的时候,做一些操作,可以把对象的属性定义成访问器属性。