
JavaScript 工厂函数
在本教程中,您将了解 JavaScript 工厂函数,它们是返回对象的函数
在本教程中,您将了解 JavaScript 工厂函数,它们是返回对象的函数。
JavaScript 工厂函数介绍
工厂函数是返回新对象的函数。下面创建一个名为 person1 的对象:
let person1 = {
firstName: 'John',
lastName: 'Doe',
getFullName() {
return this.firstName + ' ' + this.lastName;
},
};
console.log(person1.getFullName());输出:
John Doe
person1 对象有两个属性:firstName 和 lastName,以及一个 getFullName() 返回全名的方法。
假设您需要创建另一个名为 person2 的类似对象,您可以复制与上面的类似的代码:
let person2 = {
firstName: 'Jane',
lastName: 'Doe',
getFullName() {
return this.firstName + ' ' + this.lastName;
},
};
console.log(person2.getFullName());输出:
Jane Doe在此示例中,person1 和 person2 对象具有相同的属性和方法。问题是您要创建的对象越多,您编写的重复代码就越多。
为避免再次复制相同的代码,您可以定义一个创建 person 对象的函数:
function createPerson(firstName, lastName) {
return {
firstName: firstName,
lastName: lastName,
getFullName() {
return firstName + ' ' + lastName;
},
};
}当一个函数创建并返回一个新对象时,它被称为工厂函数。这 createPerson() 是一个工厂函数,因为它返回一个新的 person 对象。
下面展示如何使用 createPerson() 工厂函数创建两个对象person1 和 person2:
function createPerson(firstName, lastName) {
return {
firstName: firstName,
lastName: lastName,
getFullName() {
return firstName + ' ' + lastName;
},
};
}
let person1 = createPerson('John', 'Doe');
let person2 = createPerson('Jane', 'Doe');
console.log(person1.getFullName());
console.log(person2.getFullName());通过使用工厂函数,您可以创建任意数量的 person 对象在不编写需重复代码的情况下。
创建对象时,JavaScript 引擎会为其分配内存。如果你创建了很多 person 对象,JavaScript 引擎需要大量的内存空间来存储这些对象。
但是,每个 person 对象都有相同 getFullName() 方法的副本。这不是有效的内存管理。
为避免在每个 person 对象中重复相同的函数,您可以从对象删除 getFullName() 方法:
function createPerson(firstName, lastName) {
return {
firstName: firstName,
lastName: lastName
}
}并将此方法移动到另一个对象:
var personActions = {
getFullName() {
return this.firstName + ' ' + this.lastName;
},
};而在调用 person 对象的 getFullName() 方法之前,可以将 personActions 对象的方法赋值给 person 对象,如下:
let person1 = createPerson('John', 'Doe');
let person2 = createPerson('Jane', 'Doe');
person1.getFullName = personActions.getFullName;
person2.getFullName = personActions.getFullName;
console.log(person1.getFullName());
console.log(person2.getFullName());如果对象有很多方法,则此方方式不可扩展,因为您必须单独手动分配给它们。这就是需要使用 Object.create() 的原因。
Object.create 方法
Object.create() 方法使用现有对象作为新对象的原型来创建一个新对象:
Object.create(proto, [propertiesObject])
所以你可以使用 Object.create() 方法。如下:
var personActions = {
getFullName() {
return this.firstName + ' ' + this.lastName;
},
};
function createPerson(firstName, lastName) {
let person = Object.create(personActions);
person.firstName = firstName;
person.lastName = lastName;
return person;
}现在,您可以创建 person 对象并调用 personActions 对象的方法:
let person1 = createPerson('John', 'Doe');
let person2 = createPerson('Jane', 'Doe');
console.log(person1.getFullName());
console.log(person2.getFullName());
这代码工作得很好。但是,在实践中,您很少会使用工厂函数。相反,您使用类或构造函数/原型模式。
结论
- 工厂函数是返回新对象的函数。
Object.create()用于使用现有对象作为原型来创建对象。












