在js中创建对象有很多方式,我们首先想到的是最简单的一种,看代码一
var person={};
person.name="carl";
person.say=function(){
console.log(this.name);
}
代码一
上面的代码创建了一个person对象,它具有一个属性和一个方法,我们可以直接通过person调用他的方法和得到他的属性,到目前为止,看上去确实创建了一个对象,看上去没有问题,但是,这个对象我如何重用呢?…………貌似不可以。所以有了第二种创建对象的方式,那就是通过function来创建,
上代码二
function Person(){
this.name="carl";
this.say=function(){
console.log(this.name);
}
}
var zhangsan=new Person();
var lisi=new Person();
代码二
通过上面的代码,我们首先创建了一个Person的函数,这个函数实际上是作为构造函数而出现的,然后我们在函数里面定义了他的属性和方法,之后我们创建了两个对象,一个zhangsan,一个lisi,他们都具备了name属性和say方法,这个一看就比第一种好很多,因为我可以反复的创建对象了,可以重用了,之后创建对象的代码只需要写一行就可以了,但是这个其实也有一个问题,而且还是一个大问题,什么大问题?—–性能问题,因为通过这种的创建方式,每次都会给对象开辟空间用来存放他的属性和方法,那么,我们想想,如果是有1w个对象需要创建,我估计(猜的)浏览器应该就崩溃了,读者可以运行下面代码来做实验
console.log(zhangsan.say==lisi.say);
结果为false,因为他们会在各自的空间上面创建一个say的方法(实际上方法也是对象)。那这么看来,必须得有第三种创建对象的方法才合理,好吧,下面上第三种创建对象的方法,看代码三
function Person(){
this.name="carl";
Person.prototype.say=function(){
console.log(this.name);
}
}
var zhangsan=new Person();
var lisi=new Person();
其实比较一下代码二,只是修改了一个地方,就是把构造函数的方法放到他的prototype属性上面,这个prototype大家可以去查看相关资料了解一下,这里就不详细阐述了,简单的说,就是一个对象的公共区域,一个公共容器,什么意思呢?就是说,这个上面的东西在创建对象的时候,都不会单独分配空间来创建,他只会让对象有一个引用(或者指针),来引用他,那么也就是说,及时有1w个对象,真正的say方法也只有一份,他是存在Person.prototype上面的,我们继续代码二的实验
console.log(zhangsan.say==lisi.say);
这个就会输出true,大家下来可以试一下。
所以一般情况我会用第三种创建对象的方式。