美文网首页
vue2.0的数组劫持

vue2.0的数组劫持

作者: Mr无愧于心 | 来源:发表于2019-12-02 14:49 被阅读0次

Object.defineProperty不支持监听数组变化。所以需要重写数组上面的方法。

vue2.0对数组的方法进行了劫持,重写了能改变数组的方法实现数据的更新

const arrayProto = Array.prototype//原生Array的原型
export const arrayMethods = Object.create(arrayProto);
[
  'push',
  'pop',
  'shift',
  'unshift',
  'splice',
  'sort',
  'reverse'
].forEach(function (method) {
  const original = arrayProto[method]//缓存元素数组原型
  //这里重写了数组的几个原型方法
  def(arrayMethods, method, function mutator () {
    //这里备份一份参数应该是从性能方面的考虑
    let i = arguments.length
    const args = new Array(i)
    while (i--) {
      args[i] = arguments[i]
    }
    const result = original.apply(this, args)//原始方法求值
    const ob = this.__ob__//这里this.__ob__指向的是数据的Observer
    let inserted
    switch (method) {
      case 'push':
        inserted = args
        break
      case 'unshift':
        inserted = args
        break
      case 'splice':
        inserted = args.slice(2)
        break
    }
    if (inserted) ob.observeArray(inserted)
    // notify change
    ob.dep.notify()
    return result
  })
})

//定义属性
function def (obj, key, val, enumerable) {
  Object.defineProperty(obj, key, {
    value: val,
    enumerable: !!enumerable,
    writable: true,
    configurable: true
  });
}

上面的代码主要是继承了Array本身的原型方法,然后又做了劫持修改,可以发出通知。
  Vue在observer数据阶段会判断如果是数组的话,则修改数组的原型,这样的话,后面对数组的任何操作都可以在劫持的过程中控制。

// 以上代码 相当于
var bar = [1,2];
bar.__proto__ = arrayMethod;
// 执行
bar.push(3); 就会触发arrayMethods中的代码:ob.dep.notify()就会被触发,就会通知watcher触发template的更新。

相关文章

  • vue2.0的数组劫持

    Object.defineProperty不支持监听数组变化。所以需要重写数组上面的方法。 vue2.0对数组的方...

  • 数组如何进行劫持和观测

    数组如何进行劫持和观测 对数组[{a:1}]进行劫持 对数组进行追加push后劫持 假如data里有个数组arr ...

  • Object.defineProperty和Proxy对比

    前言:大家都是到Vue2.0 的双向绑定是通过 Object.defineProperty 来劫持对象的sette...

  • vue3.x 与 vue2.x 在写法上的区别

    1. 数据双向绑定的原理 1.1 原理 Vue2.0使用Object.defineProperty来劫持对象属性的...

  • 数组劫持

    数组数据的观察 在javascript中,忌讳改变内置函数的相关属性,所以对数组的劫持,一般是对push、shif...

  • 数组劫持

    对象的劫持比较容易: 但是对数组是无效的: 那如何对数组进行劫持呢?其实很容易,arr.unshift其实就是ar...

  • vue2.0数据劫持

    针对 Object 类型的劫持 对于 Object 类型,主要劫持其属性的读取与设置操作。在 JavaScript...

  • Vue3.x ref属性

    获取DOM或者组件实例可以使用ref属性,写法和vue2.0需要区分开。 vue2.0的方式操作ref----数组...

  • mt-ctf

    baby_focal 堆溢出,没开pie,没有show,劫持stdout来泄露地址,然后劫持数组指针造成任意地址写...

  • 1.4 对数组进行数据劫持

    对数组数据进行数据劫持 Observer,arrayMethods 如果value是数组,不需要用walk的方式对...

网友评论

      本文标题:vue2.0的数组劫持

      本文链接:https://www.haomeiwen.com/subject/pntfgctx.html