组件中 data为什么必须是函数

185 阅读1分钟
    我们都知道对象是一个引用数据类型,当多次使用同一个组件时,实际上引用的是同一个地址,这样一旦某一个组件数据发生更改,那么会直接影响到其他组件数据,不利于组件的复用,造成数据污染。而函数形式则可以避免这种现象的发生,函数中每一次都会返回一个全新的对象,这样多次使用组件时,每一次都是一个全新的对象地址,不会发生数据同步问题。

看看对象形式

//我们先定义一个构造函数
 function Component(){
 	
 }
 //在该构造函数的原型上添加一个属性保存对象
 Component.prototype.data = {
 	name:"张三"
 }
 //创建两个实例
 let a = new Component()
 let b = new Component()
//修改a实例的name属性
a.data.name = '李四'
//打印a和b的name属性
console.log(a.data.name) // 李四
console.log(b.data.name) // 李四
//我们会发现两个name都修改成了李四

产生这样的原因这是两者共用了同一个内存地址,a修改的内容,同样对b产生了影响
如果我们采用函数的形式,则不会出现这种情况

//我们先定义一个构造函数
 function Component(){
        //为了访问data属性,所以我们将data函数内容赋值到data属性中
 	this.data = this.data()
 }
 //在该构造函数的原型上添加一个属性保存对象
 Component.prototype.data = function (){
 	return {
 		name:"张三"
 	}
 }
 //创建两个实例
 let a = new Component()
 let b = new Component()
//修改a实例的name属性
a.data.name = '李四'
//打印a和b的name属性
console.log(a.data.name) //李四
console.log(b.data.name) //张三

总结:
每次复用data组件时,由于数据对象都指向同一个data对象,每次返回的都是一个新对象,避免了变量污染