Results 9 comments of 伟欣

> updateChildren部分,倒数第二个图有错误,那3个新Vnode, 应该插到 oldStartIdx前面,不是放到后面 我也是这么觉得

要讲清楚,computed原理,首先得讲vue响应式原理,因为computed的实现是基于Watcher对象的。 那么vue的响应式原理是什么呢,众所周知,vue是基于Object.defineProperty实现监听的。在vue初始化数据data和computed数据过程中。会涉及到以下几个对象: 1. Observe对象 2. Dep对象 3. Watch对象 Observe对象是在data执行响应式时候调用,因为computed属性基于响应式属性,所以其不需要创建Observe对象。 Dep对象主要功能是做依赖收集,有个属性维护多个Watch对象,当更新时候循环调用每个Watch执行更新。 Watch对象主要是用于更新,而且是收集的重点对象。 这里谈到computed计算属性,首先要知道,其有两种定义方式,一种是方法,另一种是get,set属性。而且,其内部监听的对象必须是已经定义响应式的属性,比如data的属性vuex的属性。 vue在创建computed属性时候,会循环所有计算属性,每一个计算属性会创建一个watch,并且在通过defineProperty定义监听,在get中,计算属性工作是做依赖收集,在set中,计算属性重要工作是重新执行计算方法,这里需要多补充一句,因为computed是懒执行,也就是说第一次初始化之后,变不会执行计算,下一次变更执行重新计算是在set中。 另一个补充点是依赖收集的时机,computed收集时机和data一样,是在组件挂载前,但是其收集对象是自己属性对应的watch,而data本身所有数据对应一个watch。 以下附计算属性源码验证说法: ```typescript function initComputed (vm: Component, computed: Object) { // $flow-disable-line const watchers = vm._computedWatchers =...

自动补全,自动完成第一反应不知道问的啥

真正的博客,学习了

建议去mdn看下__proto__,这个属性性能极差,而且已经废弃(不安全)。应该在构造函数的原型上做手脚,而不是利用实例的__proto__做手脚。实例和构造函数还是要区分的。