Vue3源码里的一些知识点理解

1、data.call(vm)

function initData(vm) {    
    var data = vm.$options.data; 
    var keys = Object.keys(data); 
    var i = keys.length;

    data = vm._data = 
        ( typeof data === 'function' ? 
            data.call(vm) : data ) || {};    

    while (i--) {        
        var key = keys[i];       
        if (只要不是_和$开头的属性) {
            proxy(vm, "_data", key);
        }
    }
}
  • 拿到data数据,如果data是函数,执行就拿到返回值,否则就拿设置的对象data
  • 初始化数据,是为了拿到数据,然后放到存到实例上,作为代理总部

return data.call(vm)

  • data 函数执行的时候 用 call 方法,让 vm 继承了 data 的属性和方法,将data的属性和方法指向vm。 所以我们可以使用 this.xxx

  • call 知识点:call 是 Function 对象自带的一个方法,可以改变函数体内部的 this 指向,第一个参数就是 this要指向的对象,也就是想指定的上下文,后面的参数它会按顺序传递进去。它的函数会被立即调用。

  • 官网解释:调用一个对象的一个方法,以另一个对象替换当前对象。也就是继承模式:挟持另一个对象的方法,继承另外一个对象的属性

data 为什么是个函数而不是个对象?

如果 data 是个对象,那么整个vue实例将共享一份数据,也就是各个组件实例间可以随意修改其他组件的任意值,但是 data 定义成一个函数,将会 return 出一个唯一的对象,不会和其他组件共享一个对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值