Object.defineProperty()
通过 Object.defineProperty() 劫持各个属性 然后 Object.defineProperty()里面会接受三个参数,第一个是要劫持的对象,第二个是要劫持的属性,第三个是一个选项对象,在选项对象里有两个方法get,set,get 方法是在读取属性的时候调用的函数,set 方法是在设置属性的时候调用 而如果是劫持数组的话,它第一个参数是要劫持的数据,第二个是数组的下标,第三个是一个选项对象
Object.defineProperty的缺陷就是有时不能及时的更新视图,比如通过下标方式修改数组的数据或者给对象新增属性,有时不能及时的更新视图,解决的方法就是用 $set 或者 Vue.set(), 或者就是 Object.proxy
定义:Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
1: 直接添加
自己写的例子getter和setter
getter和setter原理图:
需要Object.defineProperty()注意点:
1:用Object.defineProperty方法创建一个新属性时,如果不指定configurabel,enumberable,writable特性的默认值都是false,修改已定义的属性特性无限制。 2:Configurable性定义为不可配置就不能把它变回可配置,此时调用Object.defineProperty修改除writable之外的特性都会报错。 3:模拟访问和设置的行为:想要访问器属性模拟默认行为的话,必须的在里面新添一个属性不然会造成循环引用。
4: Object.defineProperty新添加的属性,遍历person时候不会遍历age !!!!