- 将
this
(Vue$3
)赋值给vm
- 给
vm
实例对象添加一个id
,即_uid++
- 给
vm
添加一个标识属性_isVue
,标识该对象是否应该被observe
- 判断是否为组件实例,然后两种
options
结合方式。 mergeOptions
用来合并两个options
- 合并前,先对
props
进行初始化 - 合并前,对
directives
指令进行初始化 - 合并前,判断
options
里面是否有额外的配置参数,即extends
的字段是否存在(如果是function
则合并其options
到目标对象,如何是对象则将其合并到目标对象) - 合并前,判断
options
里面是否有mixins
字段,mixins
是数组类型,如果mixin
是Vue$3
的实例,则将其options
合并到目标对象,否则合并自身到目标对象 options
合并,并以options
里面的key
为优先。- 合并完成后返回并将合并后的
options
对象赋值给vm
的$options
属性。 - 初始化对象代理函数,即
Proxy
对象 - 判断当前浏览器是否支持
Proxy
对象,即通过将该函数toString()
后判断其是否存在nativecode
字段等算法,支持即hasProxy
标识字段为true
- 如果
vm
的$options
里面包含render
属性,即将代理对象处理函数赋值为get
方法,否则为has
方法 - 然后给
vm
添加方法_renderProxy=new
Proxy(vm
,handlers)
,代理vm
的in
方法 - 如果不含
proxy
方法,则直接将本身vm
赋值到vm._renderProxy
- 将
vm
自身赋值给vm._self
- 初始化生命周期函数
- 首先判断
vm.$options
是否有parent
字段,如果有的话就将vm
实例加入到parent
的$children
字段中,即2565行代码中的.push(vm)
- 如果不存在
parent
字段,初始化vm.$parent
属性为parent
(undefined
) - 初始化
vm.$root
属性,如果parent
不存在赋值为自身,否则赋值为parent.$root
- 初始化
vm.$children
属性为数组[] - 初始化
vm.$refs
属性为空对象{} - 初始化
vm._watcher
为null
- 初始化
vm._inactive=false
- 初始化
vm._isMounted
=false
- 初始化
vm._isDestroyed=false
- 初始化
vm._isBeingDestroyed
=false
- 生命周期函数初始化完毕
- 初始化事件函数
- 初始化
vm._event
为Object.create(null)
- 初始化
vm._hasHookEvent
为false
- 初始化父对象中的事件句柄,如果
vm.options._parentListeners
存在的话 - 事件函数初始化完毕
- 初始化渲染函数(即
render)
- 初始化
vm.$vnode=null(the
placeholder
node
in
parent
tree)
- 初始化
vm._vnode=null(the
root
of
the
child
tree)
- 初始化
vm._staticTrees=null
- 初始化
vm.$slots
为optins
中的_renderChildren
,不存在的话默认为{} - 初始化
vm.$scopedSlots
为空对象{} - 初始化
vm._c
为node
节点的生成构建函数即(createElement
)(内部使用) - 初始化
vm.$createElement
为node
节点的生成构建函数即(createElement
)(外部调用) - 渲染函数初始化完毕
- 触发生命周期函数,
beforeCreate
节点,如果options
里面监听了beforeCreate
的生命周期方法,即触发该函数,同时如果vm._hasHookEvent
为true
时,触发vm.$emit
方法 - 初始化
state
函数 - 初始化
vm._watchers=
[]