1、工厂模式
function createEmpleey(name,age,job){
var e=new Object();
e.name=name;
e.age=age;
e.job=job;
e.work=function(){
alert("开始工作")
}
return e;
}
var e1=createEmpleey('htt','13','CSD');
e1.work();
var e2=createEmpleey('juju','45','teacher');
e2.work();
优点:接受参数,可以无数次的调用这个函数,创建Empleey对象,而每次他都可以返回一个包含三个属性一个方法的对象。
缺点:虽然解决了创建多个相似对象的问题,但是没有解决对象识别的问题(即怎么知道一个对象的类型)。
2、构造函数模式(使用关键字new)
function Empleey(name,age,job){
e.name=name;
e.age=age;
e.job=job;
e.work=function(){
alert("开始工作")
}
}
var e1=new Empleey('htt','13','CSD');
e1.work();
var e2=new Empleey('juju','45','teacher');
e2.work();
优点:创建自定义的构造函数意味着将来可以将它的实例标识为一种特定的类型。
缺点:每个方法都要在每个实例上重新创新一遍。e1,e2都有一个名为work()的方法,但这两个方法不是同一个Function的实例。因为ECMAScript中的函数是对象,所以每定义一个函数都是实例化了一个对象。
3、原型模式
function Empleey(){
}
Empleey.prototype.name="htt";
Empleey.prototype.age=13;
Empleey.prototype.job='teacher';
Empleey.prototype.work=function(){
alert("请开始工作")
}
var e1=new Empleey();
var e2=new Empleey();
alert(e1.work()===e2.work())//true
优点:减少了代码的重复,也可用标识来创建对象。
缺点:1、它省略了为构造函数传递初始化参数这一环节,结果所有势力在默认情况下都将取得相同的属性值。
2、原型中所有属性是被很多势力共享的,这种共享对函数来说非常适合,对于那些包含基本值的属性也还说得过去,但是对于包含引用类型值的属性来说,就是一个问题了,因为实例一般都有属于自己的全部属性。
理解原型对象
1、我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向函数的原型对象。
2、默认情况下,所有原型对象都自动获得一个constructor属性,这个属性是一个指向prototype属性所在函数的指针。
3、当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(内部属性)[[Prototype]],指向构造函数的原型对象。
function Empleey(){
}
Empleey.prototype={
constructor:Empleey,
Empleey.prototype.name="htt",
Empleey.prototype.age=13,
Empleey.prototype.job='teacher',
Empleey.prototype.work=function(){
alert("请开始工作")
}
}
var e1=new Empleey();
var e2=new Empleey();
alert(e1.work()===e2.work())//true
4、组合使用构造函数模式和原型模式
function Empleey(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.groups=['she','hit'];
}
Empleey.prototype={
constructor:Empleey,
work:function(){
alert('开始工作')
}
}
var e1=new Empleey('li','23','teacher');
var e2=new Empleey('lili','23','teacher');
alert(e1.groups===e2.groups);//false
alert(e2.work()===e1.work());//true
构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。这样,每个实例都有自己的一份实力属性的副本,但同时又共享着对方法的引用,最大限度的节省了内存。而且还支持向构造函数传递参数。这种方式也是ECMAScript种使用最广泛,认同度最高的一种创建自定义类型的方法。
5、动态原型
function Empleey(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.arr=new Array('a','b');
if(typeof Empleey._initialized == "undefined"){
Empleey.prototype.showColor = function(){
alert(this.name);
};
Empleey._initialized = true;
}
}
动态原型方式是使用一个标志来判断是否已经给原型赋予了方法。这样可以保证该方法只创建一次
另外寄生构造函数模式、稳妥构造函数模式等方式