1. 简单工厂模式
简单工厂模式是一种常见的JavaScript多个对象创建方式。该模式使用一个单独的函数来创建实例,该函数将接收参数并返回新的对象实例。
1.1 代码示例
function personFactory(name, age) {
const person = {};
person.name = name;
person.age = age;
person.sayHello = function () {
console.log('Hello, my name is ' + this.name + ', I am ' + this.age + ' years old.');
};
return person;
}
const person1 = personFactory('Amy', 18);
const person2 = personFactory('Bob', 20);
以上代码中,我们定义了一个personFactory
函数,它接收两个参数name
和age
,并返回一个新创建的对象person
。 person
包含一个sayHello
方法,用于输出个人信息。
我们可以通过调用personFactory
函数来创建多个不同的对象。例如,我们可以创建一个名为person1
的对象,其name
属性为Amy
,age
属性为18
。同样,我们可以创建另一个名为person2
的对象,该对象属性值不同于person1
。
1.2 优缺点
优点:
简单、易于理解和实现;
创建的对象类型可以在运行时确定。
缺点:
每当需要创建一个新的对象时,必须调用工厂方法,导致了额外的开销;
无法识别对象的具体类型。
2. 构造函数模式
构造函数模式是一种常见的JavaScript多个对象创建方式。该模式使用构造函数来创建对象,同样可以基于该构造函数创建多个实例。
2.1 代码示例
function Person(name, age) {
this.name = name;
this.age = age;
this.sayHello = function () {
console.log('Hello, my name is ' + this.name + ', I am ' + this.age + ' years old.');
};
}
const person1 = new Person('Amy', 18);
const person2 = new Person('Bob', 20);
以上代码中,我们定义了一个Person
构造函数,它接收两个参数name
和age
,并设置了name
和age
属性,以及sayHello
方法。我们可以通过使用new
运算符实例化Person
对象来创建多个不同的对象实例,用变量来保存每个实例的引用。
2.2 优缺点
优点:
使用构造函数创建对象时,可以使用new
关键字,使代码更具可读性,更像面向对象编程风格;
可以通过原型扩展对象的功能,提高代码复用率。
缺点:
每当需要创建一个新的对象时,必须调用构造函数,导致了额外的开销;
构造函数中定义的方法会在每个创建的对象实例中都创建一遍,无法复用,导致占用内存过多。
3. 原型模式
原型模式是一种常见的JavaScript多个对象创建方式。该模式使用原型来创建对象,同样可以基于该原型创建多个实例。
3.1 代码示例
function Person() {}
Person.prototype.name = 'Amy';
Person.prototype.age = 18;
Person.prototype.sayHello = function () {
console.log('Hello, my name is ' + this.name + ', I am ' + this.age + ' years old.');
};
const person1 = new Person();
const person2 = new Person();
以上代码中,我们定义了一个空的Person
构造函数,然后使用prototype
属性定义name
、age
属性和sayHello
方法。我们创建两个新的Person
实例对象,并可以通过实例对象进行属性和方法访问。
3.2 优缺点
优点:
每个对象都可以访问共享的原型对象上的属性和方法,不需要为每个对象都创建一遍实例方法,实例对象可以共享原型上的属性和方法;
内存占用更小。
缺点:
无法使用自身属性覆盖原型属性,可能会导致属性名称冲突和引用值共享问题;
原型中的属性和方法,是全局共享的,一旦被修改,所有对象的属性和方法都会受到影响。
4. 组合模式
组合模式是一种常见的JavaScript多个对象创建方式。该模式使用构造函数和原型的结合体来创建对象。
4.1 代码示例
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayHello = function () {
console.log('Hello, my name is ' + this.name + ', I am ' + this.age + ' years old.');
};
const person1 = new Person('Amy', 18);
const person2 = new Person('Bob', 20);
以上代码中,我们使用构造函数来定义对象的属性name
和age
,然后使用prototype
属性来定义对象的方法sayHello
。我们可以通过使用new
运算符来创建多个不同的对象实例,根据需要更改实例的属性值。
4.2 优缺点
优点:
结合了构造函数和原型的优点,同时避免了它们各自的缺点;
可以识别和访问对象实例的属性。
缺点:
结构和实现上相对复杂,容易出错。
总结
本文介绍了JavaScript中的四种常见创建多个对象的方式:简单工厂模式、构造函数模式、原型模式、组合模式。不同的模式适用于不同的场景,需要根据实际情况进行选择使用。在实践中应该根据具体业务情况,选择最合适的方式来创建对象。