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 出一个唯一的对象,不会和其他组件共享一个对象。