本帖最后由 绮罗 于 2020-1-16 16:44 编辑
VUE是个构造函数使用VUE的时候我们需要new一下,故追本寻源,在 ./instance/index 文件中找到定义VUE构造函数的代码
// 从五个文件导入五个方法(不包括 warn)import { initMixin } from './init'import { stateMixin } from './state'import { renderMixin } from './render'import { eventsMixin } from './events'import { lifecycleMixin } from './lifecycle'import { warn } from '../util/index'// 定义 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 作为参数传递给导入的五个方法initMixin(Vue)stateMixin(Vue)eventsMixin(Vue)lifecycleMixin(Vue)renderMixin(Vue)// 导出 Vueexport default Vue复制代码可以看出使用率安全模式提醒你使用new操作符来调用VUE,接着将VUE作为参数,传递给了五个引入的方法,最后导出VUE。
那么这五个方法又做了什么?
initMixinexport function initMixin (Vue: Class<Component>) { Vue.prototype._init = function (options?: Object) { // ... _init 方法的函数体,此处省略 }}复制代码原来是在VUE的原型上添加了_init方法,这个方法应该是内部初始化的一个方法,在上面我们看到过这个方法。
也就是说当我们调用new VUE()的时候会执行this._init(options)
stateMixinconst dataDef = {} dataDef.get = function () { return this._data } const propsDef = {} propsDef.get = function () { return this._props } if (process.env.NODE_ENV !== 'production') { dataDef.set = function (newData: Object) { warn( 'Avoid replacing instance root $data. ' + 'Use nested data properties instead.', this ) } propsDef.set = function () { warn(`$props is readonly.`, this) } } Object.defineProperty(Vue.prototype, '$data', dataDef) Object.defineProperty(Vue.prototype, '$props', propsDef)复制代码最后面两句很熟悉,使用Object.definePropety在Vue.prototype上定义了两个属性,分别是$data和$props,这两个属性的定义分别写在了dataDef和propsDef这两个对象上 ,仔细看上面的代码,首先分别是get,可以可以看到$data属性实际上代理的是_data这个属性,而$props代理的是_props这个实力属性,然后有一个生产环境的判断,如果不是生产环境的话,就为$data和$props这两个属性设置了set,实际上就是想提醒一下你:别想修改我,也就是说$data和$props是两个只读的属性。(又get到新的知识点,开心不 |
|