虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码

为解决这个问题,人们开始使用工厂模式

工厂模式

工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程
考虑到ECMAScript中无法创建类,开发人员就发明了一种函数,用函数来封装以待定接口创建对象的细节

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function createPerson(name, age, job) {
var o = new Object()
o.name = name
o.age = age
o.job = job
o.sayName = function () {
console.log(this.name)
}
return o
}

var person1 = createPerson(1, 2, 3)
var person2 = createPerson(4, 5, 6)

person1.sayName()
person2.sayName()

工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型)

构造函数模式

ECMAScript中的构造函数可用来创建特定类型的对象,也可以创建自定义的构造函数,也可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function Person(name, age, job) {
this.name = name
this.age = age
this.job = job
this.sayName = function () {
console.log(this.name)
}
}

var person1 = new Person(1, 2, 3)
var person2 = new Person(4, 5, 6)

person1.sayName()
person2.sayName()

与createPerson()函数的不同之处:

  • 没有显式的创建对象
  • 直接将属性和方法赋值给了this对象
  • 没有return语句

按照惯例构造函数都应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头

创建Person的新实例,必须使用new操作符
以这种方式调用构造函数实际上会经历一下四个步骤:

  • 创建一个新对象
  • 将构造函数的作用域赋给新对象(因此this就指向了这个新对象)
  • 执行构造函数中的代码(为这个新对象添加属性)
  • 返回新对象