npm i vue -S
獲得最新版本的 vue
(v2.6.8)一、實例的屬性和方法(下圖) vue
二、原型上的屬性和方法(下圖) node
三、原型鏈(下圖) react
const vm = new Vue()
以後有:npm
vm.__proto__ === Vue.prototype
vm.__proto__.__proto__ === Object.prototype
vm.__proto__.__proto__.__proto__===null
Vue.__proto__ === Function.prototype
Vue.__proto__.__proto__ === Object.prototype
Vue.__proto__.__proto__.__proto__===null
複製代碼
查看vue的源碼,實例化以後會執行原型鏈上的__init
方法,該方法執行了一系列初始化動做:ide
function Vue(options) {
if (!(this instanceof Vue)) {
warn('Vue is a constructor and should be called with the `new` keyword');
}
this._init(options);
}
Vue.prototype._init = function (options) {
initLifecycle(vm); // 把一些全局的屬性綁定到vm裏面
initEvents(vm); // 把一些全局的事件綁定到vm裏面
initRender(vm); // 渲染初始化,createElement()綁定等
callHook(vm, 'beforeCreate');
initInjections(vm); // resolve injections before data/props
initState(vm); // 把vm的屬性和方法初始化,包括props、data、methods、鉤子函數等全部屬性,並完成對data的數據劫持及加入觀察者
initProvide(vm); // resolve provide after data/props
callHook(vm, 'created');
//判斷是否有el,有則執行$mount(),沒有的話什麼都不作
if (vm.$options.el) {
vm.$mount(vm.$options.el);
}
}
複製代碼
能夠看到初始化動做作了不少事情,這也是爲何說vue初始化的時候比react慢。函數
mountComponent()
Vue.prototype.$mount = function (el, hydrating) {
el = el && inBrowser ? query(el) : undefined;
return mountComponent(this, el, hydrating)
};
複製代碼
mountComponent()
主要作了4件事beforeMount
鉤子_render()、_update()
2個函數beforeUpdate
鉤子mounted
鉤子callHook(vm, 'beforeMount');
vm._update(vm._render())
new Watcher(vm, updateComponent, noop, {
before: function before() {
if (vm._isMounted && !vm._isDestroyed) {
callHook(vm, 'beforeUpdate');
}
}
}, true /* isRenderWatcher */);
if (vm.$vnode == null) {
vm._isMounted = true;
callHook(vm, 'mounted');
}
複製代碼
_render()
一點說明(作了啥?)vm._render() --> vm.$createElement() --> createElement()
--> createComponent() --> installComponents()
--> componentVNodeHooks{
init(){},
prepatch(){},
insert(){-->callHook(vm, 'mounted')},
destroy(){}
}
複製代碼