JavaScript 构造模式 是一种创建对象的模式,它使用构造函数来创建具有特定属性和方法的对象。这种模式在 JavaScript 中非常常见,因为它允许我们创建可复用的对象模板。js 中每⼀个函数都可以作为构造函数,只要⼀个函数是通过 new 来调⽤的,那么我们就可以把它称为构造函数。执⾏构造函数⾸先会创建⼀个对象,然后将对象的原型指向构造函数的 prototype 属性,然后将执⾏上下⽂中的 this 指向这个对象,最后再执⾏整个函数,如果返回值不是对象,则返回新建的对象。因为 this 的值指向了新建的对象,因此我们可以使⽤ this 给对象赋值。构造函数模式相对于⼯⼚模式的优点是,所创建的对象和构造函数建⽴起了联系,因此我们可以通过原型来识别对象的类型。 但是构造函数存在⼀个缺点就是,造成了不必要的函数对象的创建,因为在 js 中函数也是⼀个对象,因此如果对象属性中如果包含函数的话,那么每次我们都会新建⼀个函数对象,浪费了不必要的内存空间,因为函数是所有的实例都可以通⽤的。
解释
在构造模式中,我们首先定义一个构造函数,该函数用于初始化新创建的对象的状态。然后,我们使用 new 关键字和该构造函数来创建新的对象实例。
例子
下面是一个简单的构造模式的例子:
javascript
// 定义一个构造函数
function Person(name, age) {
this.name = name;
this.age = age;
this.greet = function() {
console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
};
}
// 使用 new 关键字和构造函数创建对象实例
var person1 = new Person('Alice', 25);
var person2 = new Person('Bob', 30);
// 访问对象的属性和方法
console.log(person1.name); // 输出 "Alice"
console.log(person2.age); // 输出 "30"
// 调用对象的方法
person1.greet(); // 输出 "Hello, my name is Alice and I'm 25 years old."
person2.greet(); // 输出 "Hello, my name is Bob and I'm 30 years old."
优缺点
优点:
封装性:构造函数封装了对象的初始化代码,使得代码更加整洁和可维护。
复用性:通过调用同一个构造函数并传递不同的参数,我们可以创建多个具有相似属性和方法的对象实例。
灵活性:构造函数可以根据需要添加或修改对象的属性和方法。
缺点:
性能问题:如果构造函数中定义了方法,那么每次创建新对象时都会重新创建这些方法,这可能导致内存浪费。这种问题在大型应用程序中尤为突出。
继承不直观:虽然 JavaScript 支持原型链继承,但使用构造模式时,继承的实现可能不如其他模式(如原型模式或组合模式)直观和简单。
为了解决构造模式中方法重复创建的问题,我们通常会将方法定义在构造函数的原型上,这样所有通过该构造函数创建的对象实例都可以共享这些方法,从而节省内存。这种改进后的模式通常被称为“构造函数+原型”模式或“组合模式”。