Vue 的构造函数

研究 Vue.js 源码时,最合理的切入点就是 Vue 的实例。如 Vue.js 的教程所说的那样,“每个 Vue 应用都是通过 Vue 函数创建一个新的 Vue 实例开始的。”

新的 Vue 实例是用 Vue 构造函数来创建的:

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

一个对象的构造函数是创建其他对象的基本。按照约定,对象构造函数通常以一个大写字母开头:

function Vue (options) {
  // ...
}

通过 new 关键字来调用一个构造函数。例如,你可以通过下面的方式来调用 Vue 构造函数:

var vm = new Vue({
  // options
})

调用一个对象的构造函数后返回一个新的对象,并设置一个 this 关键字指向该对象的返回值。

Vue 对象构造函数用了一个参数:options。在函数内部,通过 if 语句来检测当前环境不是生成环境。

如果当前环境是生成环境,因为有 && 这个逻辑与运算符,表达式的后半部分就不用考虑了,整个表达式的值即为 false

若当前环境为开发环境,构造函数就会用 instanceof 检查 this 是否是 Vue 的实例。

若在开发环境,且 this 不是 Vue 的实例,就会调用 warn 函数,并传一个字符串作为参数,以提示开发者调用构造函数需要用 new 关键字。参数里,在单引号 '' 里用了一个反引号 ` ,有个很明显的好处,就是防止引号过早地结束。

最后,Vue 构造函数调用了 this._init 方法,并把构造函数的参数 options 作为自己的参数。

等等, this 在哪定义的 _init 方法?其实,这不是对象构造函数内定义的函数调用。快速看下源码会发现,_init 方法在一个单独的 initMixin 函数里,被添加到 Vue 的原型上- Vue.prototype

下一章,我们聊聊 initMixin 这个函数。

上次更新: 1/24/2019, 5:44:12 AM