1.工厂模式
function createPerson(name,age,job){
var o=new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayName=function(){
alert(this.name);
};
return o;
}
var person1=createPerson("jack",25,"software engineer");
var person2=createPerson("rose",24,"doctor");
工厂模式解决了创建多个相似对象的问题,但没有解决对象识别的问题(即怎么知道一个对象的类型)
2.构造函数模式
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
alert(this.name);
};
}
var person1=new Person("jack",25,"software engineer");
var person2=new Person("rose",24,"doctor");
构造函数模式解决了对象识别问题,但是每个方法都要在实例上重新创造一遍(不同实例上的同名函数是不相同的)。改进:通过把函数定义转移到构造函数外部:
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=sayName;
function sayName(){
alert(this.name);
}
}
var person1=new Person("jack",25,"software engineer");
var person2=new Person("rose",24,"doctor");
这样新问题又来了:如果需要定义很多方法,就要定义很多全局函数,没有封装性可言。
3.原型模式
function Person(){
}
Person.prototype.name="jack";
Person.prototype.age=25;
Person.prototype.job="software engineer";
Person.prototype.sayName=function(){
alert(this.name);
};
var person1=new Person();
person1.sayName(); //"jack"
使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法,问题也是由其共享本性导致的,特别是对包含引用类型值的属性来说,所以我们一般很少单独使用原型模式。
4.组合使用构造函数模式和原型模式
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friends=["jhon","court"];
}
Person.prototype={
constructor:Person,
sayName:function(){
alert(this.name);
}
}
var person1=new Person("jack",25,"software engineer");
var person2=new Person("rose",24,"doctor");
这是创建自定义类型最常见,最广泛使用的一种方式。
5.动态原型模式
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
if(typeOf this.sayName!="function"){
Person.prototype.sayName=function(){
alert(this.name);
};
}
}
var person1=new Person("jack",25,"software engineer");
只有在sayName()方法不存在的情况下,才把它添加到原型中。
6.寄生构造函数
function Person(name,age,job){
var o=new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayName=function(){
alert(this.name);
};
return o;
}
var person1=new Person("jack",25,"software engineer");
var person2=new Person("rose",24,"doctor");
7.稳妥构造函数模式
function Person(name,age,job){
var o=new Object();
//定义私有变量和函数
//添加方法
o.sayName=function(){
alert(name);
};
return o;
}