工厂模式
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("tom",20,"trtr");
var person2 = createPerson("tom1",24,"httt");
优点:使用同一个接口创建很多独享,避免大量的重复代码。
缺点:没有解决对象识别问题,怎样知道一个对象的类型。
构造函数模式
构造函数就是为了解决工厂模式的缺点,将它的实例标识为一种特定类型。
缺点:每个方法都要在每个实例撒很重新创建一遍。
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name)
}
}
var person1 = new Person("gr",12,"Grgr");
var person2 = new Person("gr44",45,"4y4");
原型模式
每个函数都有一个prototype的原型属性,是一个指针,指向一个对象,这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
优点:让所有对象实例共享它所包含的属性和方法。将这些信息直接添加到原型对象中。
function Person(){
}
Person.prototype.name = "tom";
Person.prototype.age = 29;
Person.prototype.jobn = "ghrrh";
var person = new Person();
原型模式下的一个坑
function Person(){
}
Person.prototype.name = "tom";
Person.prototype.age = 29;
Person.prototype.job = "ghrrh";
//有些时候为了图方面会将其写成下面这样
Person.prototype = {
name: "tom",
age: 29,
job: "ghrrh"
}
//但是这时候无意间就重写了默认的prototype对象,因此constructor属性变成了新对象的constructor属性(指向Object构造函数),不再指向Person函数
var person = new Person();
对了这里还要介绍一个原型对象:
无论什么时候,创建一个新函数,就会根据一组特定的规则创建一个prototype属性,这个属性会指向prototype对象。在默认情况下,所有原型对象都会获得一个constructor属性,这个属性包含一个指向prototype属性所在函数的指针。
缺点:
实际上,很少的人会单独使用原型模式,因为原型模式是让所有对象实例都共享一个原型对象上的属性和方法。
对于基本类型还可以,可以在实例中定义,然后覆盖原型中的,但是对于引用类型,修改一个实例上(person1)的一个引用类型的属性,就会引起另一个实例(person2)的引用类型的改变,其实我们要的不是这种效果。因此出现构造函数和原型模式结合使用。
组合使用构造函数模式和原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["tom","tom1"];
}
Person.prototype = {
constructor: Person,
sayName: function(){
alert(this.name);
}
}
var person1 = new Person("tom",20,"hhtt");
var person2 = new Person("tom1",45,"chengxuyuan");
动态原型模式
有时候像这种分开写构造和原型,很可能会感到非常困惑。
动态原型模式解决这个问题,它将所有信息都封装在了构造函数中,而通过在构造函数中初始化原型(仅在必要的情况下)。
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);
}
}
}
寄生构造函数模式
建议在可以使用其他模式的情况下,不要使用这种模式。
稳妥构造函数模式
稳妥对象:顾名思义,就是很稳妥,指的是没有公共属性,而且其方法也不引用this的对象。稳妥对象最适合在一些安全的环境中(这些环境中会禁止使用this和new)。
function Person(naem,age,job){
var o = new Object();
o.sayName = function(){
alert(name);
}
}
var friend = new Person("gg",20,"ghrhr");
friend.sayName(); //gg
总结:最开始是工厂模式。
为了标识特定类型的对象,出现构造函数模式。
为了减少创建多个没有多大关系的实例,浪费内存,出现原型模式。
为了减少修改一个实例上的属性而影响到另一个实例的属性,此时出现原型模式和构造函数相结合的模式。
至于后来的动态原型模式,寄生构造函数模式,稳妥构造函数模式,这些自己斟酌使用。
总结在这里,为大家提供一种记忆思路。