工厂模式
说明:用函数来封装以特定接口创建对象的细节
优点:解决创建多个相似对象
缺点:不能识别对象(知道一个对象的类型)构造函数可解决该问题
我对这句话的理解是,因为工厂函数只是在函数内部创建了一个新的对象,并赋给这个对象一些属性和方法,然后返回这个对象。函数的 constructor 属性(构造函数)是用来识别对象类型的,然而工厂函数本身没有被赋予任何属性和方法,所以不能识别对象类型。
1 | function createPerson (name, age, job) { |
构造模式
说明:必须使用 new
操作符来创建实例(使用 new
调用的函数才叫构造函数),函数名始终都是以大写字母开头(非构造函数以小写字母开头)
优点:可以将它的实例标志为一种特定的类型
缺点:每个方法都要在每个实例上创建一遍 (不同实例上的同名函数是不相等的)原型函数可解决该问题
1 | function Person(name, age, job) { |
使用 new
操作符调用函数,会经历一下过程:
- 创建一个对象
- 将构造函数的作用域赋给新对象(因此
this
就指向了这个新对象) - 执行构造函数重的代码(为这个新对象添加属性)
- 返回新对象
⚠️注意:以这种方式定义的构造函数是定义在
Global
对象中的原型模式
说明:通过调用构造函数创建一个新实例后,该实例内部将包含一个指针(内部属性),指向构造函数的原型对象。
优点:所有对象实例共享它所包含的属性和方法
缺点:原型对象的最大问题就是共享所有属性和方法
1 | function Person() {}; |