在使用vue
开发的时候,有一点觉得非常奇怪;使用new Vue()
的时候,data
是可以传入一个对象的;但是在组件中data
就必须为一个函数;vue
的官方文档是这么写的:
通过
Vue
构造器传入的各种选项大多数是可以在组件里使用。data
是一个例外,它必须是一个函数。如果定义成了一个对象,那么Vue
就会停止。并且会在控制台发出警告,告诉你在组件中data
必须是一个函数。
1 | // new Vue() ---- 实例 |
这是为什么?为什么在组件中data
就必须为一个函数。而new Vue()
的data
可为函数,可为对象
vue 组件的data 必须为函数的原因
最根本的原因是是我们js对于对象是传引用地址的。 如果我们传了一个对象进去。那么依此配置初始化多个实例之后,这个对象是这些多个实例共享的。
例子1:如果 data
是一个对象
1 | function Ppeople (){}; |
我们可以看出来:p1
和 p2
的原型都是 People
。也就是会继承原型的属性;因为 原型上的data
是普通对象,属于引用类型。所以P1
和p2
的data
其实都是指向同一块内存地址。严格运算符判断都是相等的,说明他们的值相等,内存地址也相同,所以修改其中一个也会影响另外一个。
例子2:如果data
是一个函数
1 | function Ppeople (){ |
我们在执行 new
的时候,Ppeople
其实充当了constructor
。这时候的this.data
还是一个函数,还没执行的函数。所以调用一下this.data()
让函数返回一个值然后重新赋值给this.data
。
Ppeople
原型的data
使用了function
。使用了function
后,data
都被锁定在当前的function
作用域中,然后被return
出去。 相当于创建了另外一个对象,所以多个实例之间互相不影响
new Vue()的data为对象为函数都可行的原因
我们看如下的例子:
1 |
|
这里的变量声明方式是直接放在了构造函数中,并不是通过原型链来查找的,这也就是为什么new Vue
的时候 data
说是可以直接为非函数。在构造函数执行的时候,data
就已经相互隔离。