1. Vue.prototype._init = function (options?: Object) {
    2. // a flag to avoid this being observed
    3. vm._isVue = true
    4. // merge options
    5. if (options && options._isComponent) {
    6. // optimize internal component instantiation
    7. // since dynamic options merging is pretty slow, and none of the
    8. // internal component options needs special treatment.
    9. initInternalComponent(vm, options)
    10. } else {
    11. vm.$options = mergeOptions(
    12. resolveConstructorOptions(vm.constructor),
    13. options || {},
    14. vm
    15. )
    16. }
    17. /* istanbul ignore else */
    18. if (process.env.NODE_ENV !== 'production') {
    19. initProxy(vm)
    20. } else {
    21. vm._renderProxy = vm
    22. }
    23. // expose real self
    24. vm._self = vm
    25. initLifecycle(vm)
    26. initEvents(vm)
    27. initRender(vm)
    28. callHook(vm, 'beforeCreate')
    29. initInjections(vm) // resolve injections before data/props
    30. initState(vm)
    31. initProvide(vm) // resolve provide after data/props
    32. callHook(vm, 'created')
    33. if (vm.$options.el) {
    34. vm.$mount(vm.$options.el)
    35. }
    36. }
    1. initProxy,作用域代理,拦截组件内访问其它组件的数据。
    2. initLifecycle建立父子组件关系,在当前实例上添加一些属性和生命周期标识。如:$children 、$refs 、 _isMounted 等。
    3. initEvents 用来存放除 @hook:生命周期钩子名称=”绑定的函数”事件的对象。如:$on 、$emit 等。
    4. initRender 用于初始化$slots 、$attrs 、$listeners
    5. initInjections初始化 inject ,一般用于更深层次的组件通信,相当于加强版子组件的 props 。用于组件库开发较多。
    6. initState 是很多选项初始化的汇总,包括: props 、methods 、data 、computed 和 watch 等。
    7. initProvide 初始化 provide
    8. vm.$mount挂载实例。

    new vue 发生了什么 - 图1