1、原型模式
var o = new Object();
o.name = name;
o.age = age;
o.sayName = function() {
console.log(this.name);
};
return o;
}
var person1 = createPerson("Nicholas", 29);
var person2 = createPerson("Greg", 27);
优点:能够解决创建多个对象的问题,兼容各个浏览器
缺点:没有解决对象识别的问题,不能知道一个对象的类型
2、构造函数模式
这种模式主要通过创建自定义的构造函数,从而定义自定义对象类型的属性和方法
this.name = name;
this.age = age;
this.sayName = function() {
console.log(this.name);
}
}
var person1 = new Person("Nicholas", 29);
var person2 = new Person("Greg", 27);
优点:可以创建多个对象,解决对象的识别问题
缺点:每个实例都会创建不同的function实例,而其实创建完成同样任务的function实例是很没有必要的
使用构造函数模式可以解决对象的识别问题,而这也是工厂模式无法办到的
构造函数需要以一个大写字母开头,而非构造函数应该以一个小写字母开头,这个主要是为了区别构造函数和其它函数,构造函数其实本身也是函数,只是用来创建对象而已
#####3、工厂模式
function Person() {
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.sayName = function() {
console.log(this.name);
}
var person1 = new Person();
var person2 = new Person();
person1.sayName(); // Nicholas
person2.sayName(); // Nicholas
优点:不用为构造函数传递参数,可以创建多个相同的对象
缺点:原型中的属性被很多实例共享,当属性为包含引用类型值的属性时,修改一个实例中属性的值,另一个实例中的属性的值也会改变
4、组合式
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype = {
constructor: Person,
sayName: function() {
console.log(this.name);
}
}
var person1 = new Person("Nicholas", 29);
var person2 = new Person("Greg", 27);
person1.sayName(); // Nicholas
person2.sayName(); // Greg
person1.sayName === person2.sayName; // true
使用这种模式创建对象,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度地节省了内存,另外,这种混成模式还支持向构造函数传递参数,可谓是集两种模式之长