Skip to content
大纲

Object.defineProperty

js
Object.defineProperty(obj, key, {
    /* 这里的键名,都是属性描述符 */
    configurable:false,  //当为true时,该属性的描述符能够被改变,同时该属性也可以从对应的对象上删除。
    enumerable:false,//该属性为true时,该属性才会出现在对象的枚举属性中。
    value:'',//默认为false
    writable:false,//当为true时,上面的value才能被赋值运算符改变。
    get(){
      console.log("取值");
    },
    set(x){
      value=x;
      console.log("设置");
    }
  })

对于对象和数组属性,只监听其指针是否改变

  1. 当传入一个对象,和key,define会对这个对象的属性监听,只监听其在栈区是否改变,如果属性值包含对象或者包含数组,修改对象属性或者数组元素,不触发set

vue中Object.defineProperty

属性劫持时判断值是否为对象,是的话再对值进行劫持,不过Object.defineProperty有弊端

  1. 对于值为数组,数组内元素的增删改,不触发set视图更新
  2. 对于对象,对象属性的增删,不触发set视图更新
  3. 内部引用也会出发get、set

使用vm.$set,vm.$set(this.data, key/index, newValue)

Released under the MIT License.