我们经常用来创建对象的方式有如下几种:
一:对象字面量或者object构造函数
var person ={ } var person = new Object()
这两个都可以用来创建单个对象,但存在一个问题,当用作一个接口来创建很多类似的对象时,会产生大量的重复代码,于是有了下面的方式;
二:工厂模式
function createPerson(name,sex,age) { var o=new Object(); o.name=name; o.sex=sex; o.age=age; o.sayName=function(){ alert(this.name); } return o; } var person1=createPerson("lilei”,"男",18);
工厂模式虽然解决了创建多个类似对象代码重复的问题,但是它也存在一个问题,无法判断这个对象的类型(只知道是object对象),于是有了下面的方式;
三:构造函数模式
function Person (name,age,sex) { this.name=name; this.age=age; this.sex=sex; this.sayName=function(){ alert(this.name); }; } var person1=new Person("lilei",18,"男");
var person2=new Person("xiaomei",18,"女");
(若有人不懂构造函数,请自行搜索补充构造函数的相关知识点喔)
alert(person1 instanceof Person) true alert(person1 instanceof Object) true
创建自定义构造函数就意味着将来可以将实例标记为特定的类型,这正是胜过工厂模式的地方;但是它也存在一个问题,每次new实例的时候,
构造函数中的属性都会重新创建一遍,也就意味着person1和person2中具有相同功能的sayName函数其实是两个不同的函数,如下验证:
alert(person1.sayName==person2.sayName) false
实现相同的功能,却要实例化两次,占用两个不同的内存,这就是构造函数存在的问题,于是,有了下面的方式;
四:原型模式(若对原型还不太理解,请看我关于原型的文章http://www.cnblogs.com/lichunyan/p/8372235.html )
function Person () { } Person.prototype.name="lilei"; Person.prototype.sex="男"; Person.prototype.age="18"; Person.prototype.sayName=function (){ alert(this.name); } var person1=new Person(); var person2=new Person(); person1.sayName(); ---"lilei" person2.sayName(); ---"lilei" alert( person1.sayName() == person2.sayName()); true
WOO~,所有实例共享了构造函数所有的属性及方法,貌似很完美了,但是,机智的你有没有发现什么不完美的地方呢?我来告诉你:
1.所有实例都共享构造函数的属性,所以,每个实例取到的都是相同的值,且不能传参修改;
2.最大的问题是由于共享引起的,其中一个实例修改了属性,则所有实例都会被动修改;
person1.name="hanmeimei";
alert(person2.name); ---"hanmeimei"
如果我们要的就是所有实例有相同的值,那这样正好,但是,如果想让每个实例的属性各不同且互不影响,那问题就来了,于是,有了下面的模式;
五:组合使用构造函数和原型模式
function Person (name,age){ this.name=name; this.age=age; } Person.prototype.sayName=function(){ alert(this.name); } var person1=new Person("lilei","18"); var person2=new Person("hanmeimei","18"); person1.sayName(); ---"lilei"; person2.sayName(); ---"hanmeimei"; person1.age=17; alert(person1.age); ---17 alert(person2.age); ---18
实例属性都是定义在构造函数中,共享的方法在原型中,两者完美结合,既实现了每个属性有自己的属性值,又实现了共享方法统一定义。
这是目前使用最广泛,认同度最高的一种创建对象的方法;
当然,还有一些其他模式,比如:动态原型模式,寄生构造函数模式等,但是目前很少用到,有兴趣的可以搜索了解一下。