newVue()时,内部会执行一个_init()方法,也就是initMixin(Vue)中定义的导出函数initMixin(Vue){Vue.prototupe_init=function(options){...}}whennewVue之后()被执行,在_init开始一系列的初始化Vue.prototupe_init=function(options){constvm=this;vm._uid=uid++;//合并选项vm.$options=mergeOptions(resolveConstructorOptions(vm.constructor),options||{},vm)//开始一系列的初始化vm._self=vminitLifecycle(vm)initEvents(vm)initRender(vm)callHook(vm,'beforeCreate')initInjections(vm)initState(vm)initProvide(vm)callHook(vm,'created')}Mergeoptions配置mergeoptions有两种情况初始化newVue执行newVue()构造函数时,参数是一个对象,是用户自定义的Configuration,它会和vue定义的原型方法和全局API合并成一个新的options参数,然后赋给一个新的属性$options子组件初始化如果是子组件初始化,除了合并上面的,还会合并父组件的参数进行合并,比如eventprops等执行一系列的初始化方法1.initLifecyle(vm)的主要作用是确认父子关系组件关系和初始化一些实例属性exportfunctioninitLifecycle(vm:Component){constoptions=vm.$options//合并的选项letparent=options.parent//找到第一个非抽象父对象)}//找到后赋值vm.$parent=parentvm.$root=parent?parent.$root:vmvm.$children=[]vm.$refs={}vm._watcher=nullvm._inactive=nullvm._directInactive=falsevm._isMounted=falsevm._isDestroyed=falsevm._isBeingDestroyed=false}Vue是组件式开发的,所以当前实例可能是其他组件的子组件,也可能是其他组件的父组件initEvents(vm)主要作用是添加父组件使用v-on注册的自定义事件或者@到子组件的事件中心exportfunctioninitEvents(vm:Component){//事件中心vm._events=Object.create(null)vm._hasHookEvent=false//initparentattachedevents//合并得到的事件optionsconstlisteners=vm.$options._parentListenersif(listeners){updateComponentListeners(vm,listeners)}}合并后可以从vm下载子组件。$options.__parentListeners读取父组件传过来的自定义事件。initRender(vm)的主要作用是挂载可以将render函数转换为vnode导出函数的方法initRender(Vue){constoptions=vm.$options;...vm._c=(a,b,c,d)=>createElement(vm,a,b,c,d,false)//转换编译器的vm.$createElement=(a,b,c,d)=>createElement(vm,a,b,c,d,true)//转换手写}主要是挂载_c和$createElement,它们只是最后一个参数不同。这两个参数可以将render函数转化为vnode,vm._c将编译器转换后的模板转化为render。$createElement转换用户自定义的rendercallHook(vm,'beforeCreate')第一个生命周期beforeCreateinitLifecycle(vm)确认组件的父子关系initEvents(vm)将父组件的自定义事件传递给子组件initRender(vm)提供了将render函数转换为vnode的方法beforeCreate执行组件的beforeCreate方法面试题:请问,在beforeCreatehook中可以通过this访问data中定义的变量。为什么以及这个钩子可以做什么和不能访问?因为在vue初始化阶段,此时data中的变量还没有挂载到this上。此时,访问将是未定义的。beforeCreate在平时开发中很少用到,通过Vue.use方法安装插件内部的install方法时,一般会选择beforeCreatehook执行。例如vuex和vue-router
