前言
计算属性在vue官方文档里简单的介绍了一下,可自定义一个函数去作用属性,说是提供的函数将作用属性的getter函数。其实,底层的实现原理并没有那么简单,用到了闭包
,Object.defineProperty
,观察者模式
1.首先是要了解Js的新特性。Object.defineProperty这个属性的getting和setting方法。
|
|
2.基于vue的观察者模式
|
|
有趣的是,当你在set去修改value的值的时候,你会发现事实上value25
和Brazil
是闭包变量val里面的值。person.country访问到的值,person.country并没有存在一个实际的value,反而是在getterfunction里闭包包含的那个value值。
我们去定一个计算属性的方法
|
|
现在我们对defineComputed做一些变形,他将支持计算函数,去调uodateCallBack。
现在有一些问题:
1.每次属性被访问的时候这个计算属性都会执行。
2.我们不知道什么时候发生的更新
4.添加一个依赖追踪器
生命一个全局对象叫做Dep
这个依赖追踪器,将会去去边defineComputed函数的关键地方
然后我们返回去去看我们是怎么修改ractive peoperty的
我们还可以更新一个onDepdencyUpdated函数,然后去粗发UpdateCallBack。
5.把所有的集合在一起。
我们将再一次去看看我们定义的自己算属性person.status
步骤一:
get()在person.status的属性时被调用,然后粗发了sets里的dep.target去执行了回调
步骤二:
get()在person.status被调用了计算方法,然后调用了get()在person.age的属性上,因为这个回掉需要这个value。
步骤三:
person.age的get()与Dep一起去检查目标是否可用,然后将其存储为依赖。
步骤四:
这个计算函数拿到了新的值并且返回,但是现在person.age
知道去通知person.status
当其value
更新
参考文献:
https://skyronic.com/blog/vuejs-internals-computed-properties