new Vue() 发生了什么

Posted 超帅的轻省回望

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了new Vue() 发生了什么相关的知识,希望对你有一定的参考价值。

先看看源码:

function Vue (options) {
  if (process.env.NODE_ENV !== \'production\' &&
    !(this instanceof Vue)
  ) {
    warn(\'Vue is a constructor and should be called with the `new` keyword\');
  }
  this._init(options);
}

Vue.prototype._init = function (options) {
    var vm = this;
    ...
    vm.$options = mergeOptions(options || {}, vm);
    ...
    initState(vm);
    ...
    if (vm.$options.el) {
      vm.$mount(vm.$options.el);
    }
    ...
  };
}

由此,不难看出做了以下步骤:
1.合并配置:

new Vue({
  store: store,
  router: router,
  render: h => h(App),
}).$mount(\'#app\')
//故,合并(路由、状态管理、 渲染函数)

2.初始化生命周期

function initState (vm) {
  vm._watchers = [];
  var opts = vm.$options;
  if (opts.props) { initProps(vm, opts.props); }
  if (opts.methods) { initMethods(vm, opts.methods); }
  if (opts.data) {
    initData(vm);
  } else {
    observe(vm._data = {}, true /* asRootData */);
  }
  if (opts.computed) { initComputed(vm, opts.computed); }
  if (opts.watch && opts.watch !== nativeWatch) {
    initWatch(vm, opts.watch);
  }
}
//initState就是将vue实例中的data,method,computed,watch等数据项做进一步得处理,其实就是做代理以及转化成可观测对象。

3.数据处理完成之后就将数据挂载到指定的钩子上:vm.$mount(vm.$options.el);

initLifecycle(vm);
initEvents(vm);
initRender(vm);
callHook(vm, \'beforeCreate\');
initInjections(vm); // resolve injections before data/props
initState(vm);
initProvide(vm); // resolve provide after data/props
callHook(vm, \'created\');

可以看到在initState(vm)执行之前,我们执行了beforeCreate方法,在initState(vm)执行之后,我们执行了created方法。因此在beforeCreate方法中,我们无法直接引用data,method,computed,watch等在initState(vm)中才开始存在的属性。

以上是关于new Vue() 发生了什么的主要内容,如果未能解决你的问题,请参考以下文章

为啥idea中的vue用不了new vue的格式

vue2.0 代码功能片段

new AnnotationConfigApplicationContext(MyBean.class)时,发生了什么?

在静态函数中使用new关键字创建对象时发生了什么

当我我们用new操作符创建对象的时候,都发生了些什么?

vue 监听函数发生事件