我的回答
普通属性
- 属性被Object.definePrototype进行劫持, 所对应的Dep中存储了对应的Watcher
- 一旦属性发生改变, 会通知Dep中的watcher进行notify
计算属性
- 不会立即执行, 有dirty属性
- 自己不会存储对应的watcher, 通过对应的属性的dep来对应的watcher, 然后进行notify\
- 有缓存
参考答案
computed属性是vue计算属性,是数据层到视图层的数据转化映射;
计算属性是基于他们的依赖进行缓存的,只有在相关依赖发生改变时,他们才会重新求值,也就是说,只要他的依赖没有发生变化,那么每次访问的时候计算属性都会立即返回之前的计算结果,不再执行函数;
- computed是响应式的,methods并非响应式。
- 调用方式不一样,computed的定义成员像属性一样访问,methods定义的成员必须以函数形式调用。
- computed是带缓存的,只有依赖数据发生改变,才会重新进行计算,而methods里的函数在每次调用时都要执行。
- computed中的成员可以只定义一个函数作为只读属性,也可以定义get/set变成可读写属性,这点是methods中的成员做不到的。
- computed不支持异步,当computed内有异步操作时无效,无法监听数据的变化
如果声明的计算属性计算量非常大的时候,而且访问量次数非常多,改变的时机却很小,那就需要用到computed;
缓存会让我们减少很多计算量。