每一个对象都是引用类型创建的。
一、工厂模式
function createPerson(){
var o=new Object();
o.name=name;
o.sex=sex;
o.sayName=function(){
alert(this.name);
}
return o;
}
var person1=new createPerson('zhangsan','男');
var person2=new createPerson('wangwu','女');
特点:1、用函数来封装,并以特定接口创建对象;2、有返回值
缺点:虽然解决了创建多个对象的问题,但没有解决对象识别的问题(怎样知道一个对象的类型)
二、构造函数模式(通过this实现)
用构造函数可以创建特定类型的对象,同时也可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法。
function Person(name,age){
this.name=name;
this.age=age;
this.sayName=function(){
alert(this.name);
}
};
var person1=new Person('zhangsan',20);
var person2=new Person('wangwu',15);
与工厂模式的区别在于:
1、没有显式地创建对象;
2、直接将属性和方法赋给了this对象
3、没有return语句
三、原型模式(通过原型对象实现)
创建的每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,而这个对象包含了所有实例共享的属性和方法。
因此可以将属性和方法放在原型对象里面,让所有实例都可以共享。
function Person(){};
Person.prototype.name='zhangsan';
Person.prototype.age=20;
Person.prototype.sayName=function(){
alert(this.name);
}
}
var person1=new Person();
person1.sayName(); //zhangsan
var person2=new Person();
person2.sayName(); //zhangsan
先新建一个空的构造函数,然后将属性和方法添加到原型对象里面,再创建实例对象,实例对象就拥有了原型对象里的属性和方法。不管创建多少个实例对象,原型对象里的属性和方法都是共享的。
四、组合构造函数模式和原型模式
构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性
function Person(name,age){ //构造函数模式
this.name=name;
this.age=age;
this.friends=['shelly','lucy'];
};
Person.prototype.sayName=function(){ //原型模式
alert(this.name);
}
var person1=new Person('zhangsan',20); //构造函数模式
var person2=new Person('wangwu',15);
person1.friends.push('van');
alert(person1.friends); //shel ly,lucy,van
alert(person2.friends); //shelly,lucy
五、动态原型模式
就是将所有代码装在一起
六、寄生构造函数模式
function Person(){
var o=new Object();
o.name=name;
o.sex=sex;
o.sayName=function(){
alert(this.name);
}
return o;
}
var person1=new Person('zhangsan','男');
var person2=new Person('wangwu','女');
跟工厂模式很像,但是是构造函数创建得
七、稳妥构造函数模式