如题所述
如何侦测数组的变化,指的是数组自身的变化,比如是否新增一个元素,是否删除一个元素等。其实数组中保存了一些元素,它们的变化也是需要侦测的。比如,当数组中object身上某个属性的值发生了变化时,也需要发送通知。此外,如果用户使用了push往数组中新增了元素,这个新增元素的变化也需要侦测。
也就是说,所有响应式数据的子数据都要侦测,不论是object中的数据还是Array中的数据。前面介绍0bserver时说过,其作用是将object的所有属性转换为gteresetter的形式来侦测变化。现在0bserver类不光能处理0bject类型的数据,还可以处理Array类型的数据。Array追踪变化的方式和 object不一样。因为它是通过方法来改变内容的,所以我们通过创建拦截器去覆盖数组原型的方式来追踪变化。
为了不污染全局Array. prototype,我们在0bserver中只针对那些需要侦测变化的数组使用_proto_来覆盖原型方法,但_proto_在ES6之前并不是标准属性,不是所有浏览器都支持它。因此,针对不支持_proto_属性的浏览器,我们直接循环拦截器,把拦截器中的方法直接设置到数组身上来拦截Array . prototype 上的原生方法。
也就是说,所有响应式数据的子数据都要侦测,不论是object中的数据还是Array中的数据。前面介绍0bserver时说过,其作用是将object的所有属性转换为gteresetter的形式来侦测变化。现在0bserver类不光能处理0bject类型的数据,还可以处理Array类型的数据。Array追踪变化的方式和 object不一样。因为它是通过方法来改变内容的,所以我们通过创建拦截器去覆盖数组原型的方式来追踪变化。
为了不污染全局Array. prototype,我们在0bserver中只针对那些需要侦测变化的数组使用_proto_来覆盖原型方法,但_proto_在ES6之前并不是标准属性,不是所有浏览器都支持它。因此,针对不支持_proto_属性的浏览器,我们直接循环拦截器,把拦截器中的方法直接设置到数组身上来拦截Array . prototype 上的原生方法。
温馨提示:答案为网友推荐,仅供参考