本文解析 JavaScript 中两种常见的对象创建模式:工厂模式与构造函数模式。工厂模式通过函数封装对象创建细节,解决了创建多个相似对象的问题,但无法识别对象类型。构造函数模式通过自定义构造函数和 this 关键字定义属性与方法,无需显式创建对象或返回语句,从而更好地解决了对象类型识别问题。
工厂模式概述
工厂模式是软件工程中广泛使用的设计模式之一,其核心在于抽象化具体对象的创建过程(本书后续章节还将探讨其他设计模式及其在 JavaScript 中的具体应用)。鉴于 ECMAScript 语言本身不支持类的概念,开发者们设计了一种特殊的函数,用于封装创建具有特定接口的对象的细节。具体实现方式可参考下方示例代码。
工厂模式代码示例
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");
工厂模式的局限性
函数 createPerson() 接收参数并构建包含必要信息的 Person 对象实例。该函数可被多次调用,每次调用均返回一个包含三个属性和一个方法的对象实例。尽管工厂模式有效解决了批量创建相似对象的需求,但它未能解决对象类型识别的问题(即如何判断一个对象的具体类型)。随着 JavaScript 技术的演进,另一种新模式应运而生。
二、构造函数模式
构造函数模式解析
诸如 Object 和 Array 等原生构造函数在运行时会自动存在于执行环境中。此外,开发者还可以创建自定义的构造函数,以定义特定对象类型的属性和方法。例如,可以使用构造函数模式对前文示例进行重构,具体代码如下所示。
构造函数模式代码示例
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");
构造函数与工厂模式的区别
在此示例中,Person() 函数替代了之前的 createPerson() 函数。对比两者代码,Person() 函数除了包含与 createPerson() 相同的逻辑外,还存在以下关键差异:
- 不再显式地创建对象实例;
- 直接将属性和方法赋值给 this 对象;
- 省略了 return 语句。
以上即为本文的全部内容,希望这些内容能对您的学习或工作有所帮助,同时也感谢大家的支持!