vue例項初始化時,Vue類的建構函式執行了this._init方法
function Vue (options) {
this._init(options)
}
Vue.prototype._init = function (options?: Object) {
const vm: Component = this
...省略部分程式碼
vm._self = vm
callHook(vm, 'beforeCreate')
initInjections(vm) // resolve injections before data/props
initState(vm)
initProvide(vm) // resolve provide after data/props
callHook(vm, 'created')
...省略部分程式碼
}
複製程式碼
由_init方法可以看出,呼叫beforecreate與created鉤子之間,依次發生了初始化inject,初始化state,以及初始化provide這幾個過程。 在此我們主要關注平常最常用到的initState過程
function initState (vm: Component) {
vm._watchers = []
const 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函式中,首先為vm例項初始化了存放觀察者的_watchers屬性, 然後依次對props,methods,data,computed,watch屬性進行了初始化與觀察者的註冊。
注意props與methods的初始化是在data之前的。這就是在data屬性的宣告過程中可以呼叫props與methods中的方法或屬性為data賦值的原因。