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("Nicholas", 29, "Software Engineer");
var person2 = createPerson("Greg", 27, "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("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
【1】与 createPerson() 不同之处:
- 没有显式地创建对象;
- 直接将属性和方法赋给了 this 对象;
- 没有 return 语句。
【2】注意:函数名首字母大写。
【3】创建 Person 的新实例,必须使用 new 操作符。
【4】以这种方式调用构造函数实际上会经历以下 4 个步骤:
- 创建一个新对象;
- 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象);
- 执行构造函数中的代码(为这个新对象添加属性);
- 返回新对象。
【5】将构造函数当做函数
- 任何函数,只要通过 new 操作符来调用,那它就可以作为构造函数;
- 任何函数,如果不通过 new 操作符来调用,那它跟普通函数没什么两样。
【6】构造函数的问题
相比工厂模式优点:可以将构造函数的实例标识为一种特定的类型
主要问题:每个方法都要在每个实例上重新创建一遍
解决方法:将函数定义转移到构造函数外面,但是在全局作用域定义不合适,使用原型模式。