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('lucy',26,'singer');
var person2 = createPerson('Alien',20,'dance');
在使用工厂模式创建对象的时候,我们都可以注意到,在createPerson函数中,返回的是一个对象。
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('lucy',26,'singer');
var person2 = new Person('Alien',20,'dance');
console.log(person1);
对比工厂模式,我们可以发现以下区别:
1.没有显示地创建对象
2.直接将属性和方法赋给了this对象
3.没有return语句
4.终于可以识别的对象的类型。对于检测对象类型,我们应该使用instanceof操作符,我们来进行自主检测:
alert(person1 instanceof Object);//ture
alert(person1 instanceof Person);//ture
alert(person2 instanceof Object);//ture
alert(person2 instanceof Object);//ture
同时我们也应该明白,按照惯例,构造函数始终要应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头。
那么构造函数确实挺好用的,但是它也有它的缺点:
就是每个方法都要在每个实例上重新创建一遍,方法指的就是我们在对象里面定义的函数。如果方法的数量很多,就会占用很多不必要的内存。
3.原型模式
function Person(){}
Person.prototype.name = 'lucy';
Person.prototype.age = 26;
Person.prototype.jbo = 'singer';
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
使用原型创建对象的方式,可以让所有对象实例共享它所包含的属性和方法
如果是使用原型创建对象模式,请看下面代码:
function Person(){}
Person.prototype.name = 'lucy';
Person.prototype.age = 26;
Person.prototype.jbo = 'singer';
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
var person2 = new Person();
person1.name ='Alien';
alert(person1.name);
4.混合构造函数和原型模式
function Person(name,age,job){
this.name =name;
this.age = age;
this.job = job;
}
Person.prototype = {
constructor:Person,
sayName: function(){
alert(this.name);
}
}
var person1 = new Person('lucy',26,'singer');
console.log(person1);
5.动态原型模式
function Car(name,price){
this.name=name;
this.price=price;
if(typeof Car.sell=="undefined"){
Car.prototype.sell=function(){
alert("我是"+this.name+",我现在买"+this.price+"万元");
}
Car.sell=true;
}
}
var camry =new Car("凯美瑞",27);
console.log(camry.sell());
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);
};
}
}
6.寄生构造函数模式
function SpecialArray(){
var array = new Array();
array.push.apply(array,arguments);
array.toPipedString = function(){
return this.join("|");
};
return array;
}
var colors = new SpecialArray("red","green","pink");
alert(colors.toPipedString());// red|green|pink
alert(colors instanceof SpecialArray); // false
7.稳妥构造函数模式
function Person(name,age,gender){
var obj = new Object();
obj.sayName = function(){
alert(name);
};
return obj;
}
var person = Person("Stan",0000,"male"); // 这里没有使用new操作符
person.sayName(); // Stan
alert(person instanceof Person); // false