为什么访问this.message会做一层代理?

来源:2-2 new Vue 发生了什么

慕仔6385915

2018-11-24

为什么访问this.message会做一层代理到this._data.message?明明实例中就有data中定义的message呢

写回答

2回答

ustbhuangyi

2018-11-25

首先,你定义一个组件是通过一个对象,这个对象包含 data 属性,然后你在 data 中定义的 message;
但这个对象并不是组件的实例,而是在实例化组件的时候,作为 options 传入;
那么在实例化组件的时候,会先合并 options 合并到组件实例的 vm.$options 上;
然后在 initData 的时候,会根据 vm.$options.data 计算赋值到 vm._data 上;
到目前为止,组件实例上都不会有 vm.message,而 vm._data.message 是存在的;
所以我们要做一层代理,当我们访问 vm.message 的时候实际上访问的是  vm._data.message

2
1
慕仔6385915
非常感谢!
2018-11-25
共1条回复

Arey_jy

2018-11-24

比如说

mounted() {
    console.log(this.message, this.$refs)
},
data: {
    message: 'Hello Vue!',
    $refs: 1
},

输出: Hello Vue! {}

可以防止在data中定义的变量覆盖Vue 内部的私有变量

1
2
慕粉4283821
在data中定义的 以 _或者$ 开头的变量 是覆盖不了Vue内部的私有变量的, 因为压根就不会对它们进行代理
2020-12-16
共2条回复

Vue.js 源码深入解析 深入理解Vue实现原理

全方位讲解 Vue.js 源码,进阶高级工程师

4984 学习 · 1037 问题

查看课程