为什么 Vue2 this 能够直接获取到 data 和 methods ?

网站建设4年前发布
26 0 0

2023030601332266780a952878c54a40b9978bae099b870d0af2339,在平时使用vue来开发项目的时候,对于下面这一段代码,我们可能每天都会见到:,但是我们自己实现一个构造函数却实现不了这种效果呢?,那么vue2中是怎么实现这种调用方式的呢?
,首先可以找到vue2的入口文件:
,src/core/instance/index,接下来看initMixin文件中是如何实现的:,其实仅仅关注initState这个函数就好了,这个函数初始化了props, methods, watch, computed
,在这里只关注initMethods和initData
,其实整个initMethods方法核心就是将this绑定到了实例身上,因为methods里面都是函数,所以只需要遍历将所有的函数在调用的时候将this指向实例就可以实现通过this直接调用的效果。
,其他的大部分代码都是用于一些边界条件的判断:
,bind函数,bind函数中主要是做了兼容性的处理,如果不支持原生的bind函数,则根据参数个数的不同分别使用call/apply来进行this的绑定,而call/apply最大的区别就是传入参数的不同,一个分别传入参数,另一个接受一个数组。
,hasOwn 用于判断是否为对象本身所拥有的对象,上文通过此函数来判断是否在props中存在相同的属性:,isReserved,判断是否为内部私有命名(以$或_开头),如果data为函数时,调用此函数对data进行执行:,proxy,代理拦截,当使用this.xxx访问某个属性时,返回this.data.xxx,其实对data的处理就是将data中的属性的key遍历绑定至实例vm上,然后使用Object.defineProperty进行拦截,将真实的数据操作都转发到this.data上。
,Object.defineProperty对象属性,所以就可以回答题目的问题了:
,通过this直接访问到methods里面的函数的原因是:因为methods里的方法通过 bind 指定了this为 new Vue的实例(vm)。
,通过 this 直接访问到 data 里面的数据的原因是:data里的属性最终会存储到new Vue的实例(vm)上的 _data对象中,访问 this.xxx,是访问Object.defineProperty代理后的 this._data.xxx。

© 版权声明

相关文章