// 初始化datafunctioninitData (vm:Component) {// 获取当前实例vm配置项中的data,即组件中定义的data,是一个对象let data =vm.$options.data// 如果 当前实例vm配置项中的data 是一个函数,调用方法 getData(data, vm),// 否则直接获取 当前实例vm配置项中的data 赋值给data变量,同时给当前实例增加属性_data data =vm._data =typeof data ==='function'?getData(data, vm): data || {}// 如果data不是一个纯对象,提示data函数必须返回一个对象if (!isPlainObject(data)) { data = {}process.env.NODE_ENV!=='production'&&warn('data functions should return an object:\n'+'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function', vm ) }// proxy data on instance// 获取data对象所有的key组成的数组keysconstkeys=Object.keys(data)// 获取当前实例vm配置上的propsconstprops=vm.$options.props// 获取当前实例vm配置上的methodsconstmethods=vm.$options.methods// 定义data对象所有key组成的数组的长度let i =keys.length// 遍历 数组keyswhile (i--) {// 获取data对象当前的keyconstkey= keys[i]// 如果methods存在,检测data中定义的key是否存在于methods中// 这就是为什么我们不能定义同名的data和methodsif (process.env.NODE_ENV!=='production') {if (methods &&hasOwn(methods, key)) {warn(`Method "${key}" has already been defined as a data property.`, vm ) } }if (props &&hasOwn(props, key)) {// 如果props存在,检测data中定义的key是否存在于props中// 这就是为什么我们不能定义同名的data和propsprocess.env.NODE_ENV!=='production'&&warn(`The data property "${key}" is already declared as a prop. `+`Use prop default value instead.`, vm ) } elseif (!isReserved(key)) { //如果data中定义的变量key不是以$或者是_命名// 作用是把 data 上的属性代理到当前 vm 实例上proxy(vm,`_data`, key) } }// observe data,监听数据变化observe(data,true/* asRootData */)}