美文网首页
Array的变化侦测

Array的变化侦测

作者: 李友胜 | 来源:发表于2019-07-27 15:21 被阅读0次

3.1 如何追踪变化

object是通过setter来追踪变化的,只要数据发生变化,就一定会触发setter。
同理,数组中push或pop等等改变数组内容,我们只要能在用户操作数组的时候得到通知就能实现目的。
我们可以通过用一个拦截器覆盖Array.prototype。之后,每当使用Array原型上的方法操作数组,其实执行的都是拦截器中的方法。

3.2 拦截器

拦截器其实就是一个和Array.prototype一样的Object,里面包含的属性一模一样,只不过这个Object中某些可以改变数组吱声的方法是我们处理过的,经过整理,我们发现Array原型中的可以改变数组自身的方法有7个,push、pop、shift、unshift、splice、sort、reverse。

const arrayProto = Array.prototype;
const arrayMethods = Object.create(arrayProto)

;['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].forEach(function (method) {
    // 缓存原始方法
    const original = arrayMethods[method]
    Object.defineProperty(arrayMethods, method, {
        value: function mutator(...args) {
            return original.apply(this, args);
        },
        enumerable: false,
        writable: true,
        configurable: true
    })
})

在上面代码中,我们可以看出arrayMethods,它继承自Array.prototype,具备其所有的功能,未来我们需要使用arrayMethods覆盖Array.prototype。接下来,在arrayMethods上使用Object.defineProperty方法将那些可以改变自身内容的方法进行封装。所以当调用push方法的时候,其实调用的是arrayMethods.push,而arrayMethods.push方法嗲用的是函数mutator。
最后在mutator中执行original(它是原生Array.prototype上的方法,例如Array.prototype.push)来做他应该做的事。所以我们可以在mutator函数中做一些其他的事情,比如发送变化通知。

3.3 使用拦截器覆盖Array原型

有了拦截器以后,就需要使用它覆盖Array.prototype。但是不能直接覆盖,因为这样会污染全局的Array。我们希望之拦截那些被侦测了变化的数据,也就是之拦截那些响应式的数组的原型。
而将一个数据转化成响应式的,需要通过Observer,所以我们只需要在Observer中使用拦截器覆盖那些即将被转化成Array类型数据的原型就好:

class Observer{
    constructor(value) {
        this.value = value;
        if (Array.isArray(value)){
            value.__proto__ = arrayMethods // 新增
        }else {
            this.walk(value)
        }
    }
}

相关文章

  • Array的变化侦测

    3.1 如何追踪变化 object是通过setter来追踪变化的,只要数据发生变化,就一定会触发setter。同理...

  • Array的变化侦测(二)

    侦测数组中元素变化 侦测数组的变化类比对Object的递归处理,我们也需要监测子项的变化。另外,数组与对象的使用需...

  • Array的变化侦测(一)

    如何追踪变化 为什么对于Array的侦测方式和Object的不同?如下一句push操作,调用的是数组原型上的方法改...

  • 【一起读】深入浅出Vue.js——Array的变化侦测

    3.1 如何追踪变化 Object通过触发getter/setter来实现变化侦测,在Array中,使用push等...

  • 变化侦测篇

    概念 vue的最大特点之一就是数据驱动视图, 我们可以把数据理解为状态, 而视图就是用户可直观看到页面, 页面不...

  • Object变化侦测

    什么是变化侦测 运行时,内部状态可能会发生变化,相应页面要重新渲染,变化侦测就是弄清楚是哪里发生了变化。从实现的方...

  • Object的变化侦测

    1.1 什么是变化侦测 vue.js会自动通过状态生成DOM,并将其输出到页面显示,这个过程叫渲染。vue.js的...

  • 深入浅出 - vue变化侦测原理

    深入浅出 - vue变化侦测原理 关于vue的内部原理其实有很多个重要的部分,变化侦测,模板编译,virtualD...

  • vue侦测数据变化

    如何使用watch侦听数据变化?如何通过计算属性computed配合watch属性来侦听数据变化?深度侦听与单一属...

  • Vue2源码解析系列

    目录 Vue整体流程一(带你了解一下Vue源码) 变化侦测篇(Observer) 虚拟DOM篇(VNode) 模板...

网友评论

      本文标题:Array的变化侦测

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