当前位置: 首页 > Web前端 > HTML

为什么Vue2的数据是函数或者方法?(面试题)

时间:2023-03-27 23:14:22 HTML

官网解释:定义组件时,data必须声明为返回一个初始数据对象的函数,因为组件可能被用来创建多个实例。如果数据仍然是一个纯对象,所有实例将共享对同一个数据对象的引用!通过提供数据函数,我们可以在每次创建新实例时调用数据函数,返回原始数据对象的新副本。当我看到这个问题时,面试官问我。我惊呆了,从来没有想过为什么。我只知道代码需要这样写。最近有时间再详细了解一下这部分的原理。有两个我比较喜欢回答1,是为了避免重复创建实例时共享同一份数据造成的数据污染  2。之所以写函数是为了保证对象是独立的。如果能保证对象的唯一性,也可以不写函数直接写对象。其实说到底,还是为了避免数据污染。要想解决这个问题,就不得不说到原型链和这个。看一个例子person1和person2是对Person的引用,所以当person2改变数据时,实际上改变的是Person的数据。由于Person的数据发生了变化,Person的引用person1也会发生变化person2=newPerson()person2.datas.a="wewew"console.log(person2)console.log(person1)之前一直有个疑问,既然person1和person2都是Person的引用,为什么要把它们放在object会造成数据污染但是放在方法中不会造成数据污染吗?首先要知道一点:this的意义在定义函数的时候是无法确定的。只有在函数执行的时候才能判断this指向了谁。实际上,this指向调用它的对象。还有一个问题,明明指向同一个方法,为什么会有不同的方法呢?你克隆了一个吗?答:在构造函数中定义的方法将在它的每个实例上克隆这个方法;构造函数的prototype属性上定义的方法会和它的所有实例共享这个方法,但不会在每个实例内部重新定义这个方法引用:functionPerson(){this.datas=this.sayHello()//this指向调用它的对象}Person.prototype.sayHello=function(){return{return{d:1,b:2}};varperson1=newPerson()varperson2=newPerson()person2.datas.d="wewew"console.log(person1)console.log(person2)  具体例子如下 1。正常状态下,使用数据函数
<模板>

  2.如果直接将数据定义为对象,会报错3.定义外部对象的形式,导致点击按钮时,同时增加两个数据时间,造成数据污染