@@ -41,8 +41,13 @@ export class Observer {
4141
4242 constructor ( value : any ) {
4343 this . value = value
44+
45+ // 实例化一个 Dep 对象
4446 this . dep = new Dep ( )
4547 this . vmCount = 0
48+
49+ // 把自身实例添加到数据对象 value 的 __ob__ 属性上
50+ // 定义在 src/core/util/lang.js
4651 def ( value , '__ob__' , this )
4752 if ( Array . isArray ( value ) ) {
4853 const augment = hasProto
@@ -60,6 +65,7 @@ export class Observer {
6065 * getter/setters. This method should only be called when
6166 * value type is Object.
6267 */
68+ // 将每个属性转换成 getter/setter,注意函数参数是对象
6369 walk ( obj : Object ) {
6470 const keys = Object . keys ( obj )
6571 for ( let i = 0 ; i < keys . length ; i ++ ) {
@@ -71,6 +77,8 @@ export class Observer {
7177 * Observe a list of Array items.
7278 */
7379 observeArray ( items : Array < any > ) {
80+
81+ // 遍历数组再次调用 observe
7482 for ( let i = 0 , l = items . length ; i < l ; i ++ ) {
7583 observe ( items [ i ] )
7684 }
@@ -114,17 +122,17 @@ export function observe (value: any, asRootData: ?boolean): Observer | void {
114122 }
115123 let ob : Observer | void
116124
117- // 如果有ob,就直接返回
125+ // 如果有ob,说明已经是个响应式对象, 就直接返回
118126 if ( hasOwn ( value , '__ob__' ) && value . __ob__ instanceof Observer ) {
119127 ob = value . __ob__
120128
121129 // 没有的话实例一个ob对象
122130 } else if (
123- shouldObserve &&
124- ! isServerRendering ( ) &&
125- ( Array . isArray ( value ) || isPlainObject ( value ) ) &&
126- Object . isExtensible ( value ) &&
127- ! value . _isVue
131+ shouldObserve && // 定义的变量,true,在initProps会改变该值
132+ ! isServerRendering ( ) && // 服务端渲染
133+ ( Array . isArray ( value ) || isPlainObject ( value ) ) && // 数组或纯对象
134+ Object . isExtensible ( value ) && // 可扩展
135+ ! value . _isVue // 不是 vue 实例
128136 ) {
129137 ob = new Observer ( value )
130138 }
@@ -148,7 +156,10 @@ export function defineReactive (
148156 /*在闭包内存储一个Dep对象*/
149157 const dep = new Dep ( )
150158
159+ // 拿到 obj 的属性描述符
151160 const property = Object . getOwnPropertyDescriptor ( obj , key )
161+
162+ // 判断,如果是不能配置的属性,直接终止程序
152163 if ( property && property . configurable === false ) {
153164 return
154165 }
@@ -160,14 +171,16 @@ export function defineReactive (
160171 val = obj [ key ]
161172 }
162173
174+ // 对子对象递归调用 observe 方法,这样就保证了无论 obj 的结构多复杂,它的所有子属性也能变成响应式的对象
163175 let childOb = ! shallow && observe ( val )
164176 Object . defineProperty ( obj , key , {
165177 enumerable : true ,
166178 configurable : true ,
167179 get : function reactiveGetter ( ) {
168- // 依赖收集
169180 const value = getter ? getter . call ( obj ) : val
170181 if ( Dep . target ) {
182+
183+ // 依赖收集
171184 dep . depend ( )
172185 if ( childOb ) {
173186 childOb . dep . depend ( )
@@ -193,6 +206,8 @@ export function defineReactive (
193206 } else {
194207 val = newVal
195208 }
209+
210+ // shallow 为 false 的情况,会对新设置的值变成一个响应式对象
196211 childOb = ! shallow && observe ( newVal )
197212 // 通知订阅者
198213 dep . notify ( )
@@ -205,6 +220,7 @@ export function defineReactive (
205220 * triggers change notification if the property doesn't
206221 * already exist.
207222 */
223+ // 当需要给对象添加新属性并触发页面改变时,可以调用set函数
208224export function set ( target : Array < any > | Object , key : any , val : any ) : any {
209225 if ( process . env . NODE_ENV !== 'production' &&
210226 ( isUndef ( target ) || isPrimitive ( target ) )
0 commit comments